我通常将所有活动事件委托给一个单独的控制器类,该控制器类具有处理来自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线程中,而不将其委托给处理程序线程。
例如,在onDestroy
方法中调用onStartup()
时会出现问题:onDestroy
清除模型和所有其他引用,但在onStartup
内它尝试在某个时刻访问模型的方法,但考虑到它是null
,抛出异常。
解决此问题的最佳方法是什么?我不想锁定每个控制器方法,因为它们中的一些可能同时发生而不会相互干扰。
答案 0 :(得分:6)
在dispose()方法中,您应该在处理模型之前清理workerHandler。请参阅Handler类中的removeCallbacks
或removeCallbacksAndMessage(null)方法。当参数为null
时,后一种方法会删除所有回调和消息。