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

时间:2011-07-21 10:16:34

标签: android android-activity nullpointerexception android-fragments activity-lifecycle

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

问题是,什么是(或可能)导致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]  

4 个答案:

答案 0 :(得分:2)

谈论完成活动时:您是否尝试finish()来自视图的活动?正确发送MyClass.this.finish()

在我看来操作系统迫使它因NPE而关闭。碎片出了点问题。其中有些东西是空的。你能否至少粘贴它崩溃的地方?

答案 1 :(得分:2)

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

@Override void onDestroy() {
    getFragmentManager().executePendingTransactions();
    super.onDestroy();
}

答案 2 :(得分:1)

您可以尝试使用compat库并进行调试。

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

答案 3 :(得分:0)

NullPointerException是由于FragmentManager中没有设置Activity的Handler这一事实引起的,所以防止崩溃的“解决方案”如下:

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) {

        } 
}