提问人:mbm29414 提问时间:2/6/2016 最后编辑:stkentmbm29414 更新时间:2/7/2016 访问量:1598
NullPointerException 与 FragmentManager.popBackStack 相关。如何解决?
NullPointerException related to FragmentManager.popBackStack. How to resolve?
问:
我有一个 Android 应用程序,其中有一个活动和一堆片段。
使用 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()
null
所以,我知道我可以使用如下代码“修复”这个问题(发现这是对 GitHub 存储库的应用修复):
FragmentManager fm = getFragmentManager();
if (fm != null) fm.popBackStack();
虽然我意识到上面的代码将“修复”问题,因为它将避免 ,(从而阻止应用程序崩溃),但它并没有通过允许我的应用程序按预期运行来真正“修复”问题。有问题的是一堆片段中的#3,如下所示:NPE
Fragment
#1 --> #2 --> #3
应用的期望行为是通过弹回可见的 #1 来响应此按钮单击。仅仅添加上面的代码似乎可以防止应用程序崩溃,但不会以所需的方式更改应用程序的 UI。Fragment
我做错了什么,以至于当我的应用程序恢复时,它的“片段状态”不正常?
答:
0赞
Eugene H
2/7/2016
#1
我从未遇到过 getFragmentManager() 为 null 的问题,因此我假设是语句的 popBack 部分导致了问题。下面是防止崩溃和处理异常的一种可能解决方案。如果它只发生过一次,那可能是一个罕见的例子。
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getSupportFragmentManager() != null) {
// Assuming the getFragmentManager() is not the Issue, rather the popBackStack is the issue
try {
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} catch (Exception e) {
// Recreate a new instance of your first fragment here.
}
} else {
/*
getFragmentManager() == null
I have never faced an issue when getFragmentManager() == null, but I would restart the activity if that is the case
*/
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
}, 250);
}
});
评论