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.

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í.

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 .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.