我有一个错误让我疯狂了好几天。不幸的是,我无法向你展示代码有两个原因,我的老板不会欣赏它而且代码库太大而无法分享。只要活动完成,就会发生错误。天气是因为我调用了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]
答案 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) {
}
}