Android 在片段或活动停止后停止所有事件
我有一个例子,在一个片段中有两个可点击的项目。项目A将当前片段与当前活动分离,并附加一个新片段。项目B导致一些UI更新。我的问题是,如果我连续快速点击这两个按钮,应用程序就会崩溃。我在UI更新中得到一个NullPointerException,因为显然片段已经从项a中分离出来。日志的更直观的表示形式:Android 在片段或活动停止后停止所有事件,android,android-lifecycle,Android,Android Lifecycle,我有一个例子,在一个片段中有两个可点击的项目。项目A将当前片段与当前活动分离,并附加一个新片段。项目B导致一些UI更新。我的问题是,如果我连续快速点击这两个按钮,应用程序就会崩溃。我在UI更新中得到一个NullPointerException,因为显然片段已经从项a中分离出来。日志的更直观的表示形式: 单击项目B 稍后单击项目A 项A导致当前片段分离,并最终导致调用onDestroyView 项目B尝试在大约150毫秒后更新UI,但UI元素现在为空,因为onDestroyView已经执行,导致N
是否有方法停止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更新方法,你会在每一个方法中进行检查吗?好的,同样,这取决于特定的实现。但是,是的,也许,我会做检查。嗯,如果这是最好的答案,那就是最好的答案。谢谢你的帮助。