【发布时间】:2012-03-23 17:53:38
【问题描述】:
我通常将所有的活动事件委托给一个单独的控制器类,它有一个特殊的方法来处理来自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,会引发异常。
解决此问题的最佳方法是什么?我不想锁定每个控制器方法,因为其中一些可能同时发生而不会相互干扰。
【问题讨论】:
-
另外,有可能系统没有调用onDestroy方法。
-
好点Yuri,但是如果它不被调用,那么所有由活动分配的对象都被JVM自己销毁?所以我不必担心,对吧?在 dispose 中,我只处理所有对象,没有别的。
标签: android concurrency synchronization dispose