android - 销毁 Activity 时停止处理程序可运行的任务

标签 android concurrency synchronization dispose

我通常将所有 Activity 事件委托(delegate)给一个单独的 Controller 类,它有一个特殊的方法来处理来自 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()方法被调用,它以这种方式清理 Controller 中的所有东西

@Override
protected synchronized void dispose() {
    .................
    if (model != null) {
        synchronized (model) {
            model.dispose();
        }
        model = null;
    }
    helper = null;
    .....................
    super.dispose();
}

如您所见, Controller 的处置发生在 UI 线程中,而不是将其委托(delegate)给处理程序线程。

例如,当在 onStartup() 方法中间调用 onDestroy 时会出现问题:onDestroy 清理模型并所有其他引用,但在 onStartup 方法内部,它会尝试在某个时候访问模型,但考虑到它是 null,就会抛出异常。

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

最佳答案

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

关于android - 销毁 Activity 时停止处理程序可运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9580551/

相关文章:

java - NumberFormat.getCurrencyInstance() 将一切都归零?

android - 检测手机浏览器显示 "Call"即使分辨率很高

java - Scala:如何测试 mutable.Set 的并发性

java-me - 了解 J2ME 中 RecordStore 的同步需求

node.js - 带有 elasticsearch 的 Postgres(保持同步)- nodeJS

android - 同步本地数据库(Sqlite)与服务器数据库android

android - android&BADA平台最大应用大小

Android Realm - 调试

go - 在没有锁的情况下并发读取函数指针是否安全?

java - ConcurrentHashMap - 奇怪的行为