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!
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. –
Le chiamate sono consecutive, quindi le nuove vengono eseguite al termine del precedente. – Albert
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