片段或活动停止后停止所有事件

时间:2013-11-20 00:36:34

标签: android android-lifecycle

我有一个案例,我在片段中有两个可点击的项目。项目A将当前片段与当前活动分离,并附加新片段。项目B导致一些UI更新。我的问题是,如果我快速连续点击它们,应用程序崩溃了。我在UI更新中得到NullPointerException,因为显然该片段已经从项目A中分离出来了。日志的更直观的表示形式:

  1. 点击项目B
  2. 此后不久点击项目
  3. 项目A导致当前片段分离,最终导致调用onDestroyView。
  4. 项目B尝试在大约150ms后更新UI,但UI元素现在为空,因为onDestroyView已经执行,导致NPE。
  5. 我正在使用运行4.2.2的Nexus 4。我正在使用Dagger进行依赖注入,我认为这可能是问题的根源,但我在整个应用程序中看到类似的边缘情况,几乎可以同时点击两个东西,而且崩溃有时会发生在没注射。在每种情况下,两个动作都会以看似未定义的顺序发生,这会导致奇怪的行为和崩溃。

    有没有办法在onStop或onDestroyView上停止所有后续或飞行中的事件?或者我是否需要为每个UI侦听器添加一个isDetached()检查?我还尝试在onDestroy中分离所有的监听器,这消除了一些但不是所有的崩溃。我似乎对这个悬而未决的问题有类似的问题:Fragment's OnClickListener called after onDestroyView

2 个答案:

答案 0 :(得分:4)

当您明确地完成Activity时,有时需要销毁片段,因此以下检查将更通用。

if(getActivity() == null || getActivity().isFinishing() || 
   fragment.isRemoving() || fragment.isDetached() || 
   !fragment.isAdded()) {
   // fragment is stopped
}

答案 1 :(得分:3)

如果没有看到实际的实现,就无法给出问题的准确解决方案,但这就是我要做的事情:

将片段的实例传递给我正在进行UI更新的方法,并检查片段当前是being removedadded还是来自用户界面detached (或其中任何组合)在实际尝试更新之前。例如:

private static void updateUi(MyFragment fragment, Object param) {
    if (fragment.isRemoving() || fragment.isDetached() || !fragment.isAdded()) {
        return;
    }

    // Update the UI
}

希望这有帮助。