Mejor práctica: Actualizar ArrayAdapter continuamente
Tengo un servicio que obtiene algunos datos de la web y actualiza una lista que se "almacena" en la aplicación.
Por lo tanto, puedo acceder a él desde la actividad principal y utilizarlo para mi ArrayAdapter.
- ¿Cuál es la diferencia entre un hilo y un manejador
- Androide modificar el texto EditarTexto
- Ayúdame a usar correctamente los Servicios y los Hilos
- AsyncTask para actualizar widget - cómo acceder a textviews en onPostExecute ()?
- Android: ejecuta un hilo repetidamente dentro de un temporizador
Cuando actualizo los datos, se cambia el elemento de referencia de la lista.
Mi pregunta es, ¿cómo 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. Adicional a eso, me gustaría implementar una versión que no está usando mucha batería!
Primero: Hilo que se llama cada segundo, actualizando 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: Utilizar un Handler con retraso final privado Handler handler = 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 } };
Así que, ¿cuál es la mejor manera de hacerlo? ¡Tal vez hay otra manera de hacerlo, pero de la cual no he pensado antes!
- Android - ¿cómo pasar los datos al Runnable en runOnUiThread?
- Qué cosas se ejecutan en el hilo principal de la interfaz de usuario al abrir una aplicación para Android
- ¿Los hilos son lo suficientemente fiables para calcular segundos?
- Hilo de fondo que bloquea la interfaz de usuario durante varios segundos
- Cómo cancelar AsyncTask cuando la actividad termina?
- Show Dialog in Juego con lienzo
- Tomando un cómputo pesado del subproceso de la interfaz de usuario de Android
- ¿Cómo debo manejar la comunicación entre los hilos de la IA y el bucle del juego principal?
En lugar de utilizar el controlador, utilizará la tarea Async. Aunque el manejador funciona aquí, pero es el concepto JAVA y Async Task es Android.
Y puede actualizar la vista de lista mediante: mFileAdapter.notifyDataSetChanged (); Sólo que es correcto.
En lugar de utilizar Handler
and Thread
, puede utilizar AlarmManager
. Simplemente inicie la alarma una vez y actualizará su lista con el período definido de intervalo sin ningún hilo o controlador. Ha creado un servicio y puede hacer referencia a ese servicio mediante 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 tener el código para actualizar su Lista.
- ¿Está Zeroconf API disponible en Android?
- Cómo detectar cuándo empieza una actividad de Android y termina