Evitare aggiornamenti troppo frequenti per le view

In Android per evitare di sovraccaricare di lavoro il thread principale, la maggior parte delle operazioni dovrebbe essere svolta in un thread secondario o in una classe che estende AsyncTask; successivamente i risultati finali sono riportati in una qualche view per essere mostrati all’utente utilizzando Activity.runOnUiThread(Runnable) o View.post(Runnable) (vedi Processes and Threads) o Handler.handleMessage() (vedi Communicating with the UI Thread).
Questi aggiornamenti non possono essere troppo frequenti altrimenti comunque si incorre nell’errore o nell’avviso “Choreographer([…]): Skipped […] frames! The application may be doing too much work on its main thread”
Una soluzione è quella di utilizzare un thread per gli aggiornamenti che eviti di inviare troppe richieste di aggiornamento in un breve lasso di tempo.
Eccone un esempio:

Nell’activity contenente le view che ricevono gli aggiornamenti crea una classe statica ActivityHandler e un metodo privato refreshView:

Il lavoro è svolto da un’altra classe, OtherClass, in un thread che qui è omesso, e quando questo lavoro è stato completato la variabile refreshRequest è impostata a true (riga 17).
Il costruttore di OtherClass fa due cose:

  1. imposta activityHandler che punta a un oggetto della classe ActivityHandler in MainActivity
  2. crea un oggetto ScheduledThreadPoolExecutor che lancia ogni secondo (vedi UI_DELAY) un thread RefresherRunnable che aggiorna le view mediante activityHandler

In questo modo tutte le richieste di aggiornamento delle view nell’arco di un secondo sono inglobate in una unica richiesta evitando così di eseguire più aggiornamenti in poche frazioni di secondo.
Naturalmente gli argomenti UI_DELAY e TimeUnit.SECONDS possono essere variati a seconda delle esigenze, ad esempio puoi anche impostare mezzo secondo con:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.