【问题标题】:Stopping Handler runnable tasks when destroying activity销毁活动时停止处理程序可运行任务
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • workerHandler 是 Handler 的类型。如何取消使用 post() 方法添加到此 Handler 的所有可运行对象?
  • 是的,但这意味着我需要跟踪我添加的所有回调,否则我不知道应该删除哪些回调。没有像“removeAllCallbacks()”之类的方法。然后我应该有一个像List<Runnable> 这样的列表,并将所有可运行文件存储在那里。
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多