android - studio - Timertask o Handler
radiobutton android checked (2)
Digamos que quiero realizar alguna acción cada 10 segundos y no necesariamente es necesario actualizar la vista.
La pregunta es: ¿es mejor (me refiero a más eficiente y efectivo) usar el temporizador con cronometraje como aquí?
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
o simplemente un controlador con posletariado
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
También le agradecería que me explicara cuándo utilizar qué enfoque y por qué uno de ellos es más eficiente que otro (si es que realmente lo es).
Hay algunas desventajas de usar Timer
Crea solo un hilo para ejecutar las tareas y si una tarea tarda demasiado en ejecutarse, otras tareas sufren. No maneja las excepciones lanzadas por las tareas y el hilo simplemente termina, lo que afecta a otras tareas programadas y nunca se ejecutan
Copiado de:
Handler
es mejor que TimerTask
.
Java TimerTask
y Android Handler
permiten programar tareas demoradas y repetidas en los hilos de fondo. Sin embargo, la literatura recomienda abrumadoramente el uso de Handler
sobre TimerTask
en Android (ver here , here , here , here , aquí y here ).
Algunos de los problemas informados con TimerTask incluyen:
- No se puede actualizar el hilo de la interfaz de usuario
- Pérdidas de memoria
- No confiable (no siempre funciona)
- Las tareas de larga duración pueden interferir con el próximo evento programado
Ejemplo
La mejor fuente para todo tipo de ejemplos de Android que he visto es en here . Aquí hay un ejemplo de Handler
de allí para una tarea repetitiva.
// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
@Override
public void run() {
// Do something here on the main thread
Log.d("Handlers", "Called on main thread");
// Repeat this the same runnable code block again another 2 seconds
handler.postDelayed(runnableCode, 2000);
}
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
Relacionado