Ser*_*nov 11 concurrency android synchronization dispose
我通常将所有活动事件委托给一个单独的控制器类,该控制器类有一个处理事件的特殊方法 Activity
@Override
public boolean handleMessage(int what, Object data) {
switch (what) {
case ExerciseViewEvent.STARTUP:
workerHandler.post(new Runnable() {
public void run() {
onStartup();
}
});
return true;
}
Run Code Online (Sandbox Code Playgroud)
这样做是为了保持UI线程响应并在后台任务中进行所有计算.
但是,当Activity.onDestroy()系统controller.dispose()调用方法时,会调用方法,以这种方式清除控制器中的所有内容
@Override
protected synchronized void dispose() {
.................
if (model != null) {
synchronized (model) {
model.dispose();
}
model = null;
}
helper = null;
.....................
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,处理控制器发生在UI线程中,而不将其委托给处理程序线程.
例如,当onDestroy在onStartup()方法中间调用时会发生问题:onDestroy清理模型和所有其他引用,但在内部onStartup方法中它尝试在某个时刻访问模型,但考虑到它null,会抛出异常.
解决此问题的最佳方法是什么?我不想锁定每个控制器方法,因为它们中的一些可能同时发生而不会相互干扰.
在dispose()方法中,您应该在处置模型之前清理workerHandler.请参阅Handler类中的removeCallbacks或removeCallbacksAndMessage(null)方法.后一种方法在参数出现时删除所有回调和消息null.
| 归档时间: |
|
| 查看次数: |
5918 次 |
| 最近记录: |