Android 为什么在完成活动时抛出NPE?

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

我犯了一个让我疯狂了好几天的错误。不幸的是,我不能向您展示代码有两个原因,我的老板不会欣赏它,而且代码库太大,无法共享。每当活动结束时都会发生此错误。这是因为我调用finish()还是因为操作系统破坏了它

问题是,是什么(或可能)导致FragmentManagerImpl中的execPendingActions()在第1196行抛出NPE

以下是stacktrace:

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!