【发布时间】:2016-05-16 11:06:58
【问题描述】:
我有一个 Android 应用,其中有一个 Activity 和一堆片段。
使用 Crashlytics,我收到了以下 Exception 的单个实例:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference
at com.company.app.Fragment$7$2.onClick(Fragment.java:397)
at android.view.View.performClick(View.java:5197)
at android.view.View$PerformClick.run(View.java:20926)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
产生此错误的代码是:
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// The next line produces the Exception
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Other code...
}, 250);
}
});
根据我对该应用程序所做的测试,发生此异常的用户以及仅发生一次的事实,我认为当某些奇怪的情况合并发生时会发生此Exception。 (基本上,我无法重现此Exception。)我假设这与用户将我的应用程序后台运行然后在稍后恢复它有关,然后getFragmentManager() 调用返回@987654327 @。
所以,我知道我可以使用如下代码“修复”这个问题(发现这是对 GitHub 存储库的应用修复):
FragmentManager fm = getFragmentManager();
if (fm != null) fm.popBackStack();
虽然我意识到上面的代码将“解决”问题,因为它将避免NPE,(从而阻止应用程序崩溃),但它并没有真正通过允许我的应用程序来“解决”问题根据需要发挥作用。有问题的Fragment 在一堆片段中排名第三,如下所示:
#1 --> #2 --> #3
应用程序所需的行为是通过弹回可见的Fragment #1 来响应此按钮单击。仅添加上面的代码似乎可以防止应用崩溃,但不会以所需的方式更改应用的 UI。
我做错了什么,以至于当我的应用程序恢复时,它的“片段状态”不正常了?
【问题讨论】:
-
我遇到了完全相同的问题,我在按钮上调用 getFragmentManager().popBackStack() 以关闭片段并返回上一个片段。我也无法重现它,但该错误频繁到足以成为一个真正的问题。
-
我现在正面临这个问题你找到解决方案了吗??
标签: android android-fragments nullpointerexception