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

11

我通常将所有Activity的事件委托给一个单独的控制器类,该类有一个特殊方法来处理来自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方法。 - Yury
好观点Yuri,但如果它没有被调用,那么活动分配的所有对象都将由JVM自己销毁?所以我不用担心,对吧?在dispose中,我只需要处理所有对象的处理,没有其他事情。 - Sergei Ledvanov
1个回答

6

workerHandler是Handler类型。我该如何取消所有使用post()方法添加到此Handler的可运行项? - Sergei Ledvanov
是的,但这意味着我需要跟踪添加的所有回调函数,否则我就不知道应该删除哪些回调函数。没有像“removeAllCallbacks()”之类的方法。我应该有一个类似于List<Runnable>的列表,并将所有可运行项存储在那里。 - Sergei Ledvanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接