Android 为什么在完成活动时抛出NPE?
我犯了一个让我疯狂了好几天的错误。不幸的是,我不能向您展示代码有两个原因,我的老板不会欣赏它,而且代码库太大,无法共享。每当活动结束时都会发生此错误。这是因为我调用finish()还是因为操作系统破坏了它 问题是,是什么(或可能)导致FragmentManagerImpl中的execPendingActions()在第1196行抛出NPE 以下是stacktrace:Android 为什么在完成活动时抛出NPE?,android,android-activity,nullpointerexception,android-fragments,activity-lifecycle,Android,Android Activity,Nullpointerexception,Android Fragments,Activity Lifecycle,我犯了一个让我疯狂了好几天的错误。不幸的是,我不能向您展示代码有两个原因,我的老板不会欣赏它,而且代码库太大,无法共享。每当活动结束时都会发生此错误。这是因为我调用finish()还是因为操作系统破坏了它 问题是,是什么(或可能)导致FragmentManagerImpl中的execPendingActions()在第1196行抛出NPE 以下是stacktrace: FragmentManagerImpl.execPendingActions() line: 1196 FragmentMan
FragmentManagerImpl.execPendingActions() line: 1196
FragmentManagerImpl$1.run() line: 375
Handler.handleCallback(Message) line: 587
Handler.dispatchMessage(Message) line: 92
Looper.loop() line: 126
ActivityThread.main(String[]) line: 3997
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 491
ZygoteInit$MethodAndArgsCaller.run() line: 841
ZygoteInit.main(String[]) line: 599
NativeStart.main(String[]) line: not available [native method]
当谈到完成活动时:您是否试图从视图中
finish()
完成活动?是否正确发送了MyClass.this.finish()
在我看来,由于NPE,操作系统迫使它关闭。碎片有点问题。其中有些东西是空的。你能至少粘贴一下它崩溃的那一行吗?你可能遇到了fragment manager中的一个bug,它在销毁之前没有清除挂起的事务列表。如果在保存状态后使用FragmentTransaction.CommitteAllowingStateLoss()提交事务,则可能发生这种情况。您可以在活动中使用以下代码解决此问题:
@Override void onDestroy() {
getFragmentManager().executePendingTransactions();
super.onDestroy();
}
您可以尝试使用compat库并调试它
或者,尝试在简化的示例应用程序中复制。NullPointerException是由于从FragmentManager中取消设置了活动的处理程序而导致的,因此防止崩溃的“解决方案”如下所示:
public void onDestroy(){
super.onDestroy();
try {
Field mActivityField = getFragmentManager().getClass().getDeclaredField("mActivity");
mActivityField.setAccessible(true);
mActivityField.set(getFragmentManager(), this);
Field mPendingActionsField = getFragmentManager().getClass().getDeclaredField("mPendingActions");
mPendingActionsField.setAccessible(true);
mPendingActionsField.set(getFragmentManager(), null);
Field f = Activity.class.getDeclaredField("mHandler");
f.setAccessible(true);
Handler handler = (Handler) f.get(this);
handler.close();
} catch (Throwable e) {
}
}
我认为你真的需要发布一些代码…我不能。把这个问题想象成“是什么导致一个NPE被抛出FragmentManagerImpl的1196行”是针对每一个活动还是仅仅针对这一个?你能至少描述一下代码在做什么吗?只有两个活动—Main和Preferences、8个片段和25个左右的类以及一个服务。Main大约有600行,它是退出时唯一崩溃的一行。@Gallal您可以尝试使用compat库并调试它。或者尝试在一个精简的示例应用程序中复制。行为“finish();”在活动中。碎片在整个应用程序的20多个位置进行操作,因此我很难向您展示我如何处理可能导致此问题的碎片。检查您如何完成活动,检查您是否从碎片中完成活动,检查充气是否正确。尝试启动片段的活动以获得结果,并尝试使用结果完成它们。。。然后完成整个活动。。。只是一个想法,这可能会避免这种情况。我的意思是删除剩余的碎片,然后完成。不幸的是,我已经尝试过了,但它不起作用。它返回false,根据文档,这意味着没有待执行的事务。这导致我们发现,在片段的一个onDestroy()中,我对空引用调用了一个方法。不幸的是,stacktrace没有说明这一点。谢谢@PJL!