2014-04-29 8 views
5

Nell'articolo Multithreading For Performance da Android Developer Blog, convertView viene utilizzato in Adapter.getItem() per visualizzare un elenco di ImageView, che vengono scaricati attraverso HttpRequest.Yet, vedo anche alcuni tutorial Android che non utilizzano il convertView, e solo gonfiare un nuovo visualizza in Adapter.getItem().Android convertView, per usarlo o no?

Mi chiedo quale vantaggio offre convertView? Come si ricicla la vista utilizzata? Dove è la vista utilizzata nella cache?

Ho fatto questa domanda perché non ho usato convertView nel mio progetto e voglio sapere il costo per non usarlo. Di seguito è la mia implementazione di una lista di immagini.

Invece di utilizzare convertView, si gonfia una nuova vista in Adapter.getItem(). Inoltre, creo una classe wrapper per tenere il personale in ogni elemento di listView. Una volta che l'immagine è stata scaricata, verrà archiviata come bitmap nella classe wrapper per ogni voce dell'elenco (L'immagine è piccola). In questo modo, posso evitare il doppio download della stessa immagine. E questo evita anche i problemi relativi alle condizioni di gara discussi in Multithreading For Performance. Ma sono ancora un po 'preoccupato, ci sono problemi che non vanno bene usando il mio metodo?


FYI: l'articolo consigliato da @Carl Anderson fornisce dettagli su come convertView funziona nell'adattatore. L'IO di Google di Romain Guy suggerito in questo articolo è un altro buon riferimento.

In una parola, convertView è ottimizzato sia nello spazio che nel tempo. Inoltre, ho abbandonato la mia imageDownloader e uso Picasso che è raccomandato da @CommonsWare. Esso funziona magicamente.

risposta

7

Il problema di non riutilizzare lo convertView è che, come hai detto, stai creando e gonfiando un nuovo View ogni volta che l'utente scorre una riga in vista. Creare e gonfiare una vista è un'enorme quantità di tempo rispetto al riutilizzo di visualizzazioni esistenti e sicuramente stai pagando un calo di prestazioni.

La mia app fa qualcosa di simile - utilizza ImageViews all'interno di righe in un ListView e quelle ImageViews sono popolate da immagini che vengono scaricate in background. Come parte della mia ricerca su un bug di threading, ho disattivato il riutilizzo di Views e la performance è stata assolutamente terribile quando l'ho fatto. Il codice ListView è ottimizzato per il riutilizzo della vista e, se non lo si mantiene, il framerate e l'usabilità ne risentiranno.

Leggendo questo link anche aiutato a capire molto meglio come funzionano ListViews: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

2

Vedo anche alcune esercitazioni su Android che non utilizzano convertView e semplicemente gonfiano una nuova vista in Adapter.getItem().

Questo non è un buon segno.

Mi chiedo quale vantaggio offre convertView?

Risparmia tempo CPU e genera meno rifiuti nell'heap.

Come si ricicla la vista utilizzata?

E è la vista utilizzata.

Dove si trova la vista utilizzata nella cache?

In AdapterView.

Ho fatto questa domanda perché non ho usato convertView nel mio progetto e voglio sapere il costo per non usarlo.

Bene, a seconda di come hai scritto l'adattatore, potresti ottenere il riciclo di righe "gratuitamente" dalla tua superclasse.

Di seguito è riportata la mia implementazione di una lista di immagini.

Non c'è alcun codice nella tua domanda.

Anziché utilizzare convertView, viene visualizzata una nuova vista in Adapter.getItem().

Solo se convertView è null. Altrimenti, utilizzare convertView. Questo richiede un costrutto if/else.

Una volta che l'immagine è stata scaricata, verrà memorizzata come bitmap nella classe wrapper per ciascuna voce dell'elenco (L'immagine è piccola). In questo modo, posso evitare il doppio download della stessa immagine.

Non capisco esattamente dove/come si scarichi l'immagine. Ci sono molte, molte librerie che fanno questo per te, e usarne una è di solito un'idea migliore di quella che sta facendo girare il tuo codice. Mi piace Picasso e Ion per questo, ma ce ne sono altri.

Ma sono ancora un po 'preoccupato, ci sono problemi che non vanno bene usando il mio metodo?

Ci può essere più di quello che ho elencato, ma senza vedere alcun codice, è difficile indovinare cosa potrebbe non essere buono.

1

La voce convertView è solo una view helper, anche se molto importante, che consente di creare meno Visualizzazioni.

ConvertView è un'ottimizzazione che ha meno a che fare con il download di immagini, rispetto alla normale creazione di viste. Gonfiare le visualizzazioni in Android è un'operazione costosa, e se la tua lista ha molti elementi, e in particolare più oggetti che possono stare su uno schermo, il dispositivo dovrà creare diverse viste quasi identiche per popolare il tuo listView.

Invece quando usi convertView aiuti il ​​sistema a creare meno visualizzazioni, perché ti dà la possibilità di riutilizzare le viste che il sistema ha già creato ma che non sono visibili all'utente, quindi devi solo cambiare il suo contenuto invece di creando una nuova vista per ogni oggetto.

Non usando convertView è una causa comune per il ritardo quando lo scorrimento tuoi listviews

0

Utilizzando convertView nel modo più semplice è semplicemente per il riciclaggio di vista piuttosto che la creazione di nuovi punti di vista ogni volta che è necessaria la vista, quindi se il vostro ListView mai vista delle perdite potrebbe non essere necessario implementarlo ad esempio una breve lista di circa 3-4 visualizzazioni. Ma è una buona pratica controllare this google I/o presentazione