2012-01-17 14 views
5

Ho un servizio che recupera alcuni dati dal web e aggiorna un elenco che è "archiviato" nell'applicazione.Best-practice: aggiornamento continuo di ArrayAdapter

Così, posso accedervi dall'attività principale e usarlo per il mio ArrayAdapter.

Quando aggiorno i dati, l'elemento di riferimento dall'elenco viene modificato.

La mia domanda è, come è la prassi migliore per aggiornare i dati nell'adattatore nell'attività principale?

Ho due soluzioni in mente, ma non so se sono corrette in questo modo. Oltre a questo, vorrei implementare una versione che non utilizza molta batteria!

Primo: Discussione che si chiama ogni secondo, aggiornando l'adattatore con notifyDataSetChanged():

private void startListUpdateThread() 
{ 
    Thread ListManageThread = new Thread() { 
     LinkItem listItem; 
     public void run() { 
      Log.d("DL", "List Update - start"); 
      while(true) 
      { 
       runOnUiThread(UpdateGUIList); 

       try { 
        Thread.sleep(1000); //5Sekunden! 
       } 
       catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Log.e("DL", "ERROR: InterruptedException - " + e.getMessage()); 
       } 
      } 
     } 
    }; 
    ListManageThread.start(); 
} 

private Runnable UpdateGUIList = new Runnable() { 

    @Override 
    public void run() { 
     mFileAdapter.notifyDataSetChanged(); 
    } 
};  

Secondo: Usando un post Handler ritardata gestore handler finale privato = new Handler();

private void startListUpdate() 
{ 
    handler.removeCallbacks(UpdateListUI); 
    handler.postDelayed(UpdateListUI, 1000); // 1 second 

} 

private Runnable UpdateListUI = new Runnable() { 
    public void run() { 
     //Remove Elements first 
     removeDeletedItemsFromList(); 

     //Update Adapter 
     mFileAdapter.notifyDataSetChanged(); 

     handler.postDelayed(this, 1500); // 1,5 seconds 
    } 
}; 

Quindi, qual è il modo migliore per farlo? Forse c'è anche un altro modo per farlo, ma di cui non ho mai pensato prima!

risposta

1

Invece di utilizzare il gestore, verrà utilizzato il task Async. Sebbene il gestore lavori qui, ma è il concetto JAVA e Async Task è Android.

E è possibile aggiornare la visualizzazione elenco utilizzando: mFileAdapter.notifyDataSetChanged(); solo è corretto

+0

Si prega di correggermi se ho torto, ma dal mio punto di vista, il compito asincrono è responsabile per un compito che è in esecuzione a breve e ha bisogno di un aggiornamento _during_ o _after_ l'attività è finita. – Webchen

0

Invece di utilizzare Handler e Thread è possibile utilizzare AlarmManager. Basta avviare l'allarme una volta e aggiornerà l'elenco con il periodo di intervallo definito senza Thread o Handler. Hai creato un servizio e puoi fare riferimento a quel servizio utilizzando AlarmManager.

AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(arg0, TestService.class); 
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0); 
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi); 

E nel TestService si può avere il codice per aggiornare l'elenco.

Problemi correlati