在销毁活动时停止处理程序可运行的任务

我通常将所有Activities事件委托给一个单独的控制器类,该控制器类有一个特殊的方法来处理来自Activity事件

 @Override public boolean handleMessage(int what, Object data) { switch (what) { case ExerciseViewEvent.STARTUP: workerHandler.post(new Runnable() { public void run() { onStartup(); } }); return true; } 

这样做是为了保持UI线程响应并在后台任务中进行所有计算。

但是,当系统调用Activity.onDestroy()方法时,会调用controller.dispose()方法,以这种方式清除控制器中的所有内容

 @Override protected synchronized void dispose() { ................. if (model != null) { synchronized (model) { model.dispose(); } model = null; } helper = null; ..................... super.dispose(); } 

如您所见,处理控制器发生在UI线程中,而不将其委托给处理程序线程。

例如,在onStartup()方法中调用onDestroy时会出现问题: onDestroy清理模型和所有其他引用,但在onStartup方法中,它尝试在某个时刻访问模型,但考虑到它为null ,抛出exception。

解决此问题的最佳方法是什么? 我不想锁定每个控制器方法,因为它们中的一些可能同时发生而不会相互干扰。

在dispose()方法中,您应该在处置模型之前清理workerHandler。 请参阅Handler类中的removeCallbacks或removeCallbacksAndMessage(null)方法。 当参数为null时,后一种方法将删除所有回调和消息。