在销毁活动时停止处理程序可运行的任务

时间:2012-03-06 08:58:11

标签: android concurrency 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;
}

这样做是为了保持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,抛出异常。

解决此问题的最佳方法是什么?我不想锁定每个控制器方法,因为它们中的一些可能同时发生而不会相互干扰。

1 个答案:

答案 0 :(得分:6)

在dispose()方法中,您应该在处理模型之前清理workerHandler。请参阅Handler类中的removeCallbacksremoveCallbacksAndMessage(null)方法。当参数为null时,后一种方法会删除所有回调和消息。