Detener tareas ejecutables de Handler al destruir actividad
Por lo general, delego todos los eventos de Actividades a una clase de controlador independiente, que tiene un método especial para manejar eventos de la Activity
@Override public boolean handleMessage(int what, Object data) { switch (what) { case ExerciseViewEvent.STARTUP: workerHandler.post(new Runnable() { public void run() { onStartup(); } }); return true; }
Esto se hace con el fin de mantener el hilo de la interfaz de usuario sensible y hacer todos los cálculos en las tareas de fondo.
- Sincronizar Android con una base de datos de sitio web?
- Sincronización de datos entre sqlite y mysql android
- Datos de sincronización de Android entre usuarios
- ¿Cómo funciona la sincronización de Firebase con datos compartidos?
- ¿Qué clave principal se debe establecer en el db de Android local antes de sincronizarlo con el servidor?
Sin embargo, cuando el método de Activity.onDestroy()
es llamado por el sistema, se llama al método controller.dispose()
, que limpia todas las cosas en el controlador de esta manera
@Override protected synchronized void dispose() { ................. if (model != null) { synchronized (model) { model.dispose(); } model = null; } helper = null; ..................... super.dispose(); }
Como puede ver, la eliminación del controlador ocurre en el subproceso de interfaz de usuario, sin delegarla en un subproceso de controlador.
El problema ocurre cuando, por ejemplo, onDestroy
se llama en medio del método onStartup()
: onDestroy
limpia el modelo y todas las demás referencias, pero dentro del método onStartup
intenta acceder al modelo en algún momento, pero considerando que es null
, Se produce una excepción.
¿Cuál es la mejor manera de resolver este problema? No quiero bloquear todos los métodos de control porque algunos de ellos pueden ocurrir simultáneamente sin interferir entre sí.
- Cómo sincronizar datos entre la aplicación android y el servidor php?
- ¿Alguien implementó (o consiguió más información) en Android SyncObserver
- AnimatorSet con setStartDelay llama a onAnimationStart
- Conectar la aplicación android con la base de datos de un sitio web
En el método dispose () debe limpiar el workerHandler antes de deshacerse del modelo. Vea los removeCallbacks
o removeCallbacksAndMessage (null) en la clase Handler. El último método elimina todas las devoluciones de llamada y mensajes cuando el argumento es null
.