Italian App con 1000 immagini :-O

MARCO CORRIAS

Active Member
Licensed User
Buongiorno,
qualcuno riesce a dirmi la tecnica di lavoro di una App per commercio Online ( Amazon, Eprice...) su come gestiscono le innumerevoli immagine dei vari prodotti ?
Presumo non vengano caricate alla partenza sulla smartphone dell'utente ... ma ci sara in link su un server che richiamerà il prodotto da visualizzare volta per volta ??

Quindi non si sarà una frase tipo

Dim bmp As Bitmap
bmp = LoadBitmap(File.DirAssets, "CocaCola-image.png", ......

ma
bmp = LoadBitmap( ?????? , "CocaCola-image.png", ......

Grazie in anticipo
 

Star-Dust

Expert
Licensed User
Buongiorno marco,

Ci sono tanti metodi che si possono usare. in linea di principio si deve usare metodi asincroni in modo da non bloccare l'app.

A volte le immagini vengono caricate in background all'avvio dell'app. Come ad esempio fa WhatsApp per le immagini di profilo.

1000 immagini non sono poche e nemmeno tantissime. Molto dipende dal peso in byte.

Se è un catalogo online probabilmente viene caricato per settore o per tipologia di Articolo quindi ne potrà caricare forse 30 50 o 100 alla volta. Con un metodo asincrono usando resumable sub puoi caricarle uno alla volta e farla apparire a schermo.
Meglio se conosci già prima la quantità immagini che andrai a caricare in modo da generare un ImageView vuota per ogni immagine. man mano che ogni singolo immagini viene caricata la trasferisce sul rispettivo ImageView.
 

MARCO CORRIAS

Active Member
Licensed User
Buongiorno marco,

Ci sono tanti metodi che si possono usare. in linea di principio si deve usare metodi asincroni in modo da non bloccare l'app.

A volte le immagini vengono caricate in background all'avvio dell'app. Come ad esempio fa WhatsApp per le immagini di profilo.

1000 immagini non sono poche e nemmeno tantissime. Molto dipende dal peso in byte.

Se è un catalogo online probabilmente viene caricato per settore o per tipologia di Articolo quindi ne potrà caricare forse 30 50 o 100 alla volta. Con un metodo asincrono usando resumable sub puoi caricarle uno alla volta e farla apparire a schermo.
Meglio se conosci già prima la quantità immagini che andrai a caricare in modo da generare un ImageView vuota per ogni immagine. man mano che ogni singolo immagini viene caricata la trasferisce sul rispettivo ImageView.
Intanto , grazie per la celere risposta.
Le immagini sono 500 ...
quindi mi stai consigliando ti utilizzare il metodo asincrono ... !!
che dici ... trova qualche esempio nel forum ?? cosa cerco "asincrono resumable" ??
Grazie
 

sirjo66

Well-Known Member
Licensed User
..... e io aggiungo che per caricare le immagini dal server dovrai utilizzare OkHttpUtils2

ad esempio:
B4X:
Dim bmp As Bitmap
Dim j As HttpJob
j.Initialize("", Me)
j.Download("http://b4x-4c17.kxcdn.com/images/Logo_on-dark.png")
Wait For (j) JobDone(j As HttpJob)
If j.Success Then
    bmp = Job.GetBitmap
    ' ...... associa la bitmap al ImageView
End If
j.Release
 

MARCO CORRIAS

Active Member
Licensed User
..... e io aggiungo che per caricare le immagini dal server dovrai utilizzare OkHttpUtils2

ad esempio:
B4X:
Dim bmp As Bitmap
Dim j As HttpJob
j.Initialize("", Me)
j.Download("http://b4x-4c17.kxcdn.com/images/Logo_on-dark.png")
Wait For (j) JobDone(j As HttpJob)
If j.Success Then
    bmp = Job.GetBitmap
    ' ...... associa la bitmap al ImageView
End If
j.Release
Grande !!!!
Grazie , più tardi mi metto in opera !!
Grazie ancora !!
 

sirjo66

Well-Known Member
Licensed User
il codice che ti ho scritto non utilizza il sistema asincrono, ma sincrono
Il vantaggio del sistema sincrono è che non devi gestire gli eventi ma come vedi il codice scorre, si ferma sul WaitFor in attesa che l'immagine venga scaricata e poi prosegue, e quindi hai un codice molto facile, ma ha lo svantaggio che finchè sta aspettando non farà nulla altro.
Il sistema asincrono invece ti permette di fare altre cose finchè aspetti, e quando l'immagine arriva viene generato un evento e lì devi gestire il tutto.
Vedi tu quale sistema ti è più utile, ma io per partire proverei questo metodo, non credo che su una singola schermata caricherai molte immagini, per cui puoi provare e casomai dopo studiarti il sistema asincrono.
 

Star-Dust

Expert
Licensed User
il codice che ti ho scritto non utilizza il sistema asincrono, ma sincrono
Il vantaggio del sistema sincrono è che non devi gestire gli eventi ma come vedi il codice scorre, si ferma sul WaitFor in attesa che l'immagine venga scaricata e poi prosegue, e quindi hai un codice molto facile, ma ha lo svantaggio che finchè sta aspettando non farà nulla altro.
Il sistema asincrono invece ti permette di fare altre cose finchè aspetti, e quando l'immagine arriva viene generato un evento e lì devi gestire il tutto.
Vedi tu quale sistema ti è più utile, ma io per partire proverei questo metodo, non credo che su una singola schermata caricherai molte immagini, per cui puoi provare e casomai dopo studiarti il sistema asincrono.
il Wait For gestisce le funzioni Asincrone come fosse Sincrone, ma comunque è Asincono il metodo che usi :p
Erel said:
Resumable subs is a new feature added in B4J v5.50 / B4i v4.00 / B4A v7.00. It dramatically simplifies the handling of asynchronous tasks.
Il link che ho postato è quello di Erel che usa il Wait For per caricare un immagine, come nel tuo esempio. Stiamo dicendo la stessa cosa di fatto.
 

sirjo66

Well-Known Member
Licensed User
il Wait For gestisce le funzioni Asincrone come fosse Sincrone, ma comunque è Asincono il metodo che usi :p
Esatto, il WaitFor fa proprio questo, ti semplifica la vita, e quindi è come se il codice diventasse sincrono, anche se lui utilizza funzioni asincrone, io ho solo semplificato la spiegazione :D
 

valentino s

Active Member
Licensed User
Ti passo i miei due cents:
- non caricare 500 immagini da 100kb facendo aspettare. Perdi utenti. Carica quelle che servono quando servono e lasciale da parte. Meglio nella memoria esterna se disponibile. Non e' solo un problema di sincrono / asincrono, ma di decidere quali immagini caricare subito e quali dopo. Soprattutto se piu' lunghe di 100kb :)
- carica nella app le immagini che servono alla app per funzionare, se non devi aggiornarle.
- carica da web e conserva solo le immagini che servono: potresti avere poca memoria sul device, quindi controlla spazio e controlla se l'immagine c'e' ancora
- lascia temporanee le immagini che verranno viste presumibilmente una o due volte e mai piu' :)
- utilizza cache sul server per non spedire immagini gia' spedite. il browser interno (webview) dovrebbe gestire la cache da solo.
- attento alle dimensioni e ai formati dei device. Una webview ti risolve tanti problemi.

L'idea e' caricare solo quello che serve quando serve, per far aspettare il meno possibile e per occupare meno memoria possibile.

Ciao a tutti e buone feste !
 

MARCO CORRIAS

Active Member
Licensed User
..... e io aggiungo che per caricare le immagini dal server dovrai utilizzare OkHttpUtils2

ad esempio:
B4X:
Dim bmp As Bitmap
Dim j As HttpJob
j.Initialize("", Me)
j.Download("http://b4x-4c17.kxcdn.com/images/Logo_on-dark.png")
Wait For (j) JobDone(j As HttpJob)
If j.Success Then
    bmp = Job.GetBitmap
    ' ...... associa la bitmap al ImageView
End If
j.Release
un dubbio :

sino a ieri mi permettevo di caricare solo alcuni file immagine o , comunque, non mi preoccupavo di farlo
questo perché mi salvavo con il seguente metodo "se non esiste il file .. carico una immagine provvisoria "

If File.Exists( File.DirRootExternal,dirCreate & "/" & cercafile ) Then
bitmap1.Initialize(File.DirRootExternal,dirCreate & "/" & cercafile)
Else
bitmap1.Initialize(File.DirAssets,"NoImage.gif")
End If

esiste qualche controllo del genere con la libreria HttpJob ?

Grazie
 
Top