Autore Topic: AsyncTask ListView ed immagini  (Letto 1091 volte)

Offline prezzemolo86

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
AsyncTask ListView ed immagini
« il: 13 Maggio 2013, 20:01:12 CEST »
0
Salve,

sono alle prime armi e vorrei un consiglio.
Ho già usato AsyncTask per elencare le righe della ListView, come spiegato in altri post, e funziona alla grande.
Facendo una richiesta http ottengo un xml da parserizzare e tramutandolo in una lista di oggetti li aggiungo all'adapter che li adatta alla riga e li visualizza.

Purtroppo per me, non finisce qui. Per ogni riga devo visualizzare pure un'immagine. Il mio oggetto mi fornisce l'url dell'immagine.
Come devo fare? Ho provato orribilmente a far richiamare un altro AsynTask dal getView(...) dell'adapter, ma ovviamente non funziona. Non riesco a pensare come posso fare.
« Ultima modifica: 14 Maggio 2013, 11:34:07 CEST da Ricky` »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask ListView ed immagini
« Risposta #1 il: 14 Maggio 2013, 11:39:36 CEST »
0
La tecnica si chiama "lazy load" ed è ampiamente discussa. Se cerchi un attimino con quella keyword troverai molto materiale a riguardo.
Prova a dare un occhio anche a questa libreria: https://github.com/novoda/ImageLoader
Qui avevo postato qualche linea di codice che ne esemplifica il funzionamento: Come velocizzare il caricamento di una lista ?? - Android Developers Italia ma fai comunque riferimento ai samples della libreria stessa.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AsyncTask ListView ed immagini
« Risposta #2 il: 14 Maggio 2013, 13:00:17 CEST »
0
Come ti è stato suggerito sopra, cerca sul lazy loading, troverai molte informazioni.
La cosa importante è chi esegue il caricamento delle immagini.
Non va eseguito nel thread UI, ma nemmeno nel getView() dell'adapter che stai utilizzando.

Mi permetto di suggerire un link esterno http://blog.stylingandroid.com/archives/1737
Non è banale, ma anche la domanda che hai posto non lo è.





Offline prezzemolo86

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
Re:AsyncTask ListView ed immagini
« Risposta #3 il: 14 Maggio 2013, 18:20:25 CEST »
0
Grazie mille per le risposte, ora verifico e vi farò sapere come andrà. In effetti il mio problema è proprio dove startare il thread, perché nel thread dell'UI no ho  i dati che i interessano, nel getView non tiene traccia della posizione quindi si crea un bel pasticcio.

A presto con le news ;-)


Post unito: 14 Maggio 2013, 19:48:41 CEST
Ho visto i vari esempi e diciamo che ci sono quasi.

Penso che farò una cache, per poter salvare gli elementi scaricati e non doverli richiamare ogni volta, anche perché allo startup devo caricare le immagini che ho in locale, far partire il thread per scaricare, aggiornare la cache ed i files in locale e quindi aggiornare la UI.

In teoria tutto questo mi è chiaro, ma nella pratica, non riesco a capire DOVE devo startare il thread.

Come dicevo all'inizio ho già un AsyncThread che si occupa di recuperare la lista di oggetti i cui campi (Nome, Descrizione...) andranno a comporre le righe della ListView.
L'unico punto dove credo posso richiamare il thread per riempire la cache mi sembra nel metodo onPostExecute del mio AsyncThread, perché è lì che setto gli elementi della lista. Si può chiamare un Thread all'interno di tale metodo? qualora si potess (ed ora scusatemi la domanda forse un po' stupida) se aggiorno, per ogni oggetto della lista, la mia cache con l'immagine, come fa ad essere aggiornata e visibile nel getView dell'adapter? DOvrei passare l'adaper alla classe che carica le immagini ed ogni volta che faccio il put nella cache setto tale struttura nell'adapter. Se così fosse, il getView aggiorna in diretta la riga relativa all'immagine aggunta o dobbiamo aspettare che l'utente scrolli?
Tutto questo ha senso ed  potenzialmente efficiente?

Scusate se ho scritto tanto, ma rischio di fare confusione. Io faccio qualche prova e speriamo vada bene.
  :-(
« Ultima modifica: 14 Maggio 2013, 19:48:41 CEST da prezzemolo86, Reason: Merged DoublePost »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:AsyncTask ListView ed immagini
« Risposta #4 il: 14 Maggio 2013, 20:40:43 CEST »
0
Ti consiglio di provare e fare una cosa alla volta.
Per la gestione della cache , dai una occhiata a questa lib https://github.com/chrisbanes/Android-BitmapCache.

Per il metodo onPostExecute(), fai attenzione perchè viene lanciata nella main UI.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:AsyncTask ListView ed immagini
« Risposta #5 il: 14 Maggio 2013, 21:03:14 CEST »
+1
Se utilizzi la libreria che ho linkato sopra hai gratis anche la gestione della cache a due livelli (memoria e scheda sd).