我通常将所有 Activity 事件委托(delegate)给一个单独的 Controller 类,它有一个特殊的方法来处理来自 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()
方法被调用,它以这种方式清理 Controller 中的所有东西
@Override
protected synchronized void dispose() {
.................
if (model != null) {
synchronized (model) {
model.dispose();
}
model = null;
}
helper = null;
.....................
super.dispose();
}
如您所见, Controller 的处置发生在 UI 线程中,而不是将其委托(delegate)给处理程序线程。
例如,当在 onStartup()
方法中间调用 onDestroy
时会出现问题:onDestroy
清理模型并所有其他引用,但在 onStartup
方法内部,它会尝试在某个时候访问模型,但考虑到它是 null
,就会抛出异常。
解决此问题的最佳方法是什么?我不想锁定每个 Controller 方法,因为其中一些方法可能会同时发生而不会相互干扰。
最佳答案
在 dispose() 方法中,您应该在处理模型之前清理 workerHandler。查看removeCallbacks
或 removeCallbacksAndMessage(null) Handler 类中的方法。当参数为 null
时,后一种方法会删除所有回调和消息。
关于android - 销毁 Activity 时停止处理程序可运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9580551/