Non sono davvero sicuro che l'uso di setHasStableId
flag risolverà il tuo problema. In base alle informazioni fornite, il problema di prestazioni potrebbe essere correlato a un problema di memoria. Le prestazioni della tua applicazione in termini di interfaccia utente e memoria sono abbastanza correlate.
La scorsa settimana ho scoperto che la mia app perdeva memoria. L'ho scoperto perché dopo 20 minuti di utilizzo della mia app ho notato che l'interfaccia utente funzionava molto lentamente. La chiusura / apertura di un'attività o lo scorrimento di un RecyclerView con un gruppo di elementi è stato molto lento. Dopo aver monitorato alcuni dei miei utenti in produzione utilizzando http://flowup.io/ ho trovato questo:
Il tempo di frame era davvero molto alto e i frame al secondo davvero molto bassi. Puoi vedere che alcuni fotogrammi hanno richiesto circa 2 secondi per il rendering: S.
Cercando di capire cosa stesse causando questo cattivo tempo di frame / fps ho scoperto di avere un problema di memoria come puoi vedere qui:
Anche quando il consumo medio di memoria era vicino ai 15 MB, contemporaneamente l'app perdeva frame.
È così che ho scoperto il problema dell'interfaccia utente. Ho avuto una perdita di memoria nella mia app che causava molti eventi di garbage collector e questo stava causando le cattive prestazioni dell'interfaccia utente perché la VM Android ha dovuto interrompere la mia app per raccogliere memoria ogni singolo frame.
Guardando il codice ho riscontrato una perdita all'interno di una visualizzazione personalizzata perché non stavo annullando la registrazione di un ascoltatore dall'istanza di Android Choreographer. Dopo aver rilasciato la correzione, tutto è diventato normale :)
Se la tua app perde frame a causa di un problema di memoria, dovresti esaminare due errori comuni:
Verifica se la tua app sta allocando oggetti all'interno di un metodo richiamato più volte al secondo. Anche se questa allocazione può essere eseguita in un luogo diverso in cui l'applicazione sta diventando lenta. Un esempio potrebbe essere la creazione di nuove istanze di un oggetto all'interno di un metodo di visualizzazione personalizzato onDraw su onBindViewHolder nel titolare della visualizzazione del riciclatore. Verifica se la tua app sta registrando un'istanza in Android SDK ma non la rilascia. Anche la registrazione di un ascoltatore in un evento bus potrebbe essere una possibile perdita.
Dichiarazione di non responsabilità: lo strumento che ho utilizzato per monitorare la mia app è in fase di sviluppo. Ho accesso a questo strumento perché sono uno degli sviluppatori :) Se vuoi accedere a questo strumento, rilasceremo presto una versione beta! Puoi unirti al nostro sito web: http://flowup.io/ .
Se vuoi usare diversi strumenti puoi usare: traveview, dmtracedump, systrace o il monitor delle prestazioni Andorid integrato in Android Studio. Ma ricorda che questi strumenti monitoreranno il tuo dispositivo connesso e non il resto dei tuoi dispositivi utente o installazioni del sistema operativo Android.