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

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线程中,而不将其委托给处理程序线程.

例如,当onDestroyonStartup()方法中间调用时会发生问题:onDestroy清理模型和所有其他引用,但在内部onStartup方法中它尝试在某个时刻访问模型,但考虑到它null,会抛出异常.

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

Mar*_*ano 6

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