4

我有一个错误让我疯狂了好几天。不幸的是,我无法向您展示代码有两个原因,我的老板不会欣赏它,并且代码库太大而无法分享。只要活动完成,就会发生错误。天气是因为我调用了 finish() 还是因为操作系统破坏了它。

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

这是堆栈跟踪:

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]  
4

4 回答 4

2

在谈论完成活动时:您是否尝试finish()从视图中进行活动?是否正确发送MyClass.this.finish()

在我看来,操作系统强制它关闭由于 NPE。碎片有问题。其中有些是空的。您至少可以粘贴崩溃的行吗?

于 2011-07-23T12:54:31.910 回答
2

您可能在片段管理器中遇到了一个错误,它在被销毁之前没有清除其待处理事务的列表。如果您在保存状态后使用 FragmentTransaction.commitAllowingStateLoss() 提交事务,就会发生这种情况。您可以在活动中使用以下代码解决它:

@Override void onDestroy() {
    getFragmentManager().executePendingTransactions();
    super.onDestroy();
}
于 2011-07-25T19:33:19.057 回答
1

您可以尝试使用兼容库并对其进行调试。

或者尝试在缩减的示例应用程序中重现。

于 2011-07-28T13:08:15.650 回答
0

NullPointerException 是由于 Activity 的 Handler 未从 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) {

        } 
} 
于 2015-07-09T09:40:52.803 回答