Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在片段或活动停止后停止所有事件_Android_Android Lifecycle - Fatal编程技术网

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

Android 在片段或活动停止后停止所有事件,android,android-lifecycle,Android,Android Lifecycle,我有一个例子,在一个片段中有两个可点击的项目。项目A将当前片段与当前活动分离,并附加一个新片段。项目B导致一些UI更新。我的问题是,如果我连续快速点击这两个按钮,应用程序就会崩溃。我在UI更新中得到一个NullPointerException,因为显然片段已经从项a中分离出来。日志的更直观的表示形式: 单击项目B 稍后单击项目A 项A导致当前片段分离,并最终导致调用onDestroyView 项目B尝试在大约150毫秒后更新UI,但UI元素现在为空,因为onDestroyView已经执行,导致N

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

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


    是否有方法停止onStop或onDestroyView中的所有后续或飞行中事件?或者我需要向我的每个UI侦听器添加isDetached()检查吗?我还尝试在onDestroy中分离所有的侦听器,这消除了一些但不是所有的崩溃。似乎我有一个与这个未回答的问题类似的问题:

    如果不看到您的实际实现,就不可能给出问题的确切解决方案,但我会这样做:

    将片段的实例传递给我正在执行UI更新的方法,并在实际尝试更新之前检查片段是否当前来自UI(或它们的任何组合)。例如:

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

    希望这对您有所帮助。

    当您明确完成活动时,有时需要销毁片段,因此下面的检查将更加通用

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

    谢谢你的回复。所以,如果我有一堆UI更新方法,你会在每一个方法中进行检查吗?好的,同样,这取决于特定的实现。但是,是的,也许,我会做检查。嗯,如果这是最好的答案,那就是最好的答案。谢谢你的帮助。