如果我在片段中有以下代码:
public void doSomething() {
if (getActivity() == null)
return; // no null pointer exceptions here!
// ...
// do bunch of stuff here
// ...
getActivity().setTitle("done something"); // just whatever
}
如您所见,在方法的开头,我检查 getActivity() 是否为空,如果是则返回。但是,如果它不为 null,则该方法继续执行。最后,我再次调用 getActivity() 来设置标题,但是我不检查 getActivity() 是否为空。从理论上讲,此时 Fragment 可能已与 Activity 分离,因此 getActivity() 可能为 null,因此最后一行将抛出 NullPointerException。解决方案是什么?每次我想调用它时检查 getActivity() 是否为空?
编辑:即使我们尝试这个,也可以获得 NPE - 我每次都调用 getActivity() 来简化示例:
public void doSomething() {
Activity activity = getActivity();
if (activity == null)
return; // no null pointer exceptions here!
// ...
// do bunch of stuff here
// ...
activity.setTitle("done something"); // just whatever
}
问题不在于 Activity 尚未完成加载 - 例如,这可能在加载后几分钟发生,作为对任何事件的响应。问题不是第一次调用 getActivity,而是从我们检查活动是否为空到最后一次引用它的 15 行左右,它不再存在。
我现在没有 logcat,但这就是正在发生的事情。我们自己还没有真正看到这一点,但这是针对一个应用程序,该函数每天被调用数千次,因此可能偶尔会发生在某人身上。
编辑 2:我目前正在做的是尝试和捕捉 NPE,如果失败则不做任何事情。然而,这似乎是解决问题的一种丑陋方式——我想知道是否有更好的解决方案!