2010-09-27 13 views
5

Ho un elenco abbastanza semplice con 3 campi TextView su ogni riga. Stiamo aggiornando i loro valori ogni 2 secondi o giù di lì con i dati provenienti da una chiamata sfondo webservice (AsyncTask)di Listview notifydatasetchanged() molto lento ridisegnare

Confrontiamo i prossimi valori con quelli attuali, aggiorniamo di conseguenza sulla scheda e, infine, chiamando notifyDataSetChanged(), se necessario

Il problema è che il ridisegno diventa molto lento e quindi sospende l'intera interfaccia quando abbiamo più di 3 righe di aggiornamento contemporaneamente. Ovviamente utilizziamo tutte le ottimizzazioni note di ListView come l'approccio EfficientAdapter (setTag() e titolari) e getViewTypecount()/getItemViewType(). Abbiamo anche cercato di ottimizzare la nostra interfaccia il più possibile con layoutopt e cercando di evitare larghezze e altezze di wrap_content per alleggerire le cose.

Noi non facciamo operazioni costose sui nostri aggiornamenti sia, solo roba standard: modifica dei valori di testo, textcolor e backgroundColor TextView.

L'unica cosa strana che posso vedere è che GetView() viene chiamato 3-4-5 volte per ogni fila, anche se ho letto tutti i messaggi quelli di Romain [1] dice che non è nulla di sbagliato in questo

Qualche idea o suggerimento su come possiamo accelerarlo?

Grazie mille!

[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e

+0

Sembra quasi che stai ricevendo più aggiornamenti di quello che sei in grado di disegnare - avete provato diminuendo la frequenza degli aggiornamenti a 10 secondi per verificare questo? Se questo ti aiuta, dovrai trovare una soluzione per cancellare la coda dall'attività con ogni aggiornamento. 2 secondi è abbastanza spesso se si considera che la garbage collection automatica può richiedere fino a 1 secondo (si spera non di più) e altri servizi possono ritardare anche l'aggiornamento. –

+0

Le chiamate sono consecutive, quindi le nuove vengono eseguite al termine del precedente. – Albert

+0

Il caso peggiore di un raccoglitore di rifiuti occupa oltre 200 ms, non è nulla in confronto con l'interruzione dell'interfaccia utente 1.5 - 2 che l'app sperimenta in ogni nuovo aggiornamento. La frequenza di aggiornamento non influisce qui, anche se la rilancio a 10 secondi, dopo che la chiamata è stata attivata, il ridisegno continuerà a congelarsi per quei 2 secondi – Albert

risposta

0

Suppongo che si può impostare un tag a ur textView come l'url dove si otterrà l'aggiornamento dal. E invece di chiamare "notifyDataSetChanged()", puoi provare a usare findViewByTag (URL di aggiornamento) e setText per quella vista, in modo tale che la visualizzazione del testo sia ridipinta e non l'intero elenco più e più volte. Ridurrebbe sufficientemente il numero di ripetizioni extra. Solo un pensiero.

1

Questo è per coloro la navigazione da parte di Google di pensare che hanno bisogno di riscrivere i propri dati metodo cambiati. Sulla base dei miei dati, non è necessario per molti casi.

notifyDataSetChanged() può essere MOLTO PIÙ VELOCE rispetto alla sostituzione codificata a mano e tutto dipende dall'attuale implementazione listview.

Esempio: un semplice 3-line solo testo ListView con max 10K fila ArrayList aggiornato tramite la selezione del menu.

Manuale notifyDataSetChange()

--- avg run-time: 4ms 

predefinito libero notifyDataSetChange()

--- avg run-time: 0ms <--- you can't get faster than this. 

Non eseguire per creare la propria sostituzione a meno che il tempo e valutare il vostro roba. Usa la roba gratis fino a quando è necessario.