我通常将所有Activity的事件委托给一个单独的控制器类,该类有一个特殊方法来处理来自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
,会抛出异常。
解决此问题的最佳方法是什么?我不想锁定每个控制器方法,因为其中一些可能同时进行而互不干扰。