我有一个案例,我在片段中有两个可点击的项目。项目A将当前片段与当前活动分离,并附加新片段。项目B导致一些UI更新。我的问题是,如果我快速连续点击它们,应用程序崩溃了。我在UI更新中得到NullPointerException,因为显然该片段已经从项目A中分离出来了。日志的更直观的表示形式:
我正在使用运行4.2.2的Nexus 4。我正在使用Dagger进行依赖注入,我认为这可能是问题的根源,但我在整个应用程序中看到类似的边缘情况,几乎可以同时点击两个东西,而且崩溃有时会发生在没注射。在每种情况下,两个动作都会以看似未定义的顺序发生,这会导致奇怪的行为和崩溃。
有没有办法在onStop或onDestroyView上停止所有后续或飞行中的事件?或者我是否需要为每个UI侦听器添加一个isDetached()检查?我还尝试在onDestroy中分离所有的监听器,这消除了一些但不是所有的崩溃。我似乎对这个悬而未决的问题有类似的问题:Fragment's OnClickListener called after onDestroyView。
答案 0 :(得分:4)
当您明确地完成Activity时,有时需要销毁片段,因此以下检查将更通用。
if(getActivity() == null || getActivity().isFinishing() ||
fragment.isRemoving() || fragment.isDetached() ||
!fragment.isAdded()) {
// fragment is stopped
}
答案 1 :(得分:3)
如果没有看到实际的实现,就无法给出问题的准确解决方案,但这就是我要做的事情:
将片段的实例传递给我正在进行UI更新的方法,并检查片段当前是being removed,added还是来自用户界面detached (或其中任何组合)在实际尝试更新之前。例如:
private static void updateUi(MyFragment fragment, Object param) {
if (fragment.isRemoving() || fragment.isDetached() || !fragment.isAdded()) {
return;
}
// Update the UI
}
希望这有帮助。