2012-01-17 23 views
5

Tengo un servicio que obtiene algunos datos de la web y actualiza una lista que está "almacenada" en la aplicación.Práctica recomendada: actualice ArrayAdapter continuamente

Por lo tanto, puedo acceder desde la actividad principal y usarla para mi ArrayAdapter.

Cuando actualizo los datos, se cambia el elemento al que se hace referencia de la lista.

Mi pregunta es, ¿cuál es la mejor práctica para actualizar los datos en el adaptador en la actividad principal?

Tengo dos soluciones en mente, pero no sé si son correctas de esa manera. ¡Además de eso, me gustaría implementar una versión que no esté usando mucha batería!

Primero: Tema que se llama cada segundo, actualizar el adaptador 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(); 
    } 
};  

Segundo: El uso de un puesto de Manejador de retraso manejador Handler final privado = 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 
    } 
}; 

Entonces, ¿cuál es la mejor manera de hacerlo? ¡Quizás también haya otra forma de hacerlo, pero de la que no había pensado antes!

Respuesta

1

En lugar de utilizar el controlador, utilizará la tarea Async. Aunque el controlador funciona aquí, pero es el concepto de JAVA y Async Task es Android.

Y puede actualizar la vista de lista utilizando: mFileAdapter.notifyDataSetChanged(); solo es correcto

+0

Corrígeme si me equivoco, pero desde mi punto de vista, la tarea asíncrona es responsable de una tarea que se está ejecutando en breve y necesita una actualización _durante_ o _después_ de que la tarea haya finalizado. – Webchen

0

En lugar de usar Handler y Thread puede usar AlarmManager. Simplemente inicie la alarma una vez y actualizará su lista con el período de intervalo definido sin ningún subproceso o controlador. Usted creó un servicio y puede hacer referencia a ese servicio utilizando el 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); 

Y en el TestService puede hacer que el código para actualizar la lista.

Cuestiones relacionadas