如果我在片段中有以下代码:
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,如果是,则返回。但是,如果它不为null,则该方法继续执行。最后,我再次调用getActivity()来设置标题,但是我不检查getActivity()是否为null。从理论上讲,此时可能已将Fragment与Activity分离,因此getActivity()可能为null,因此最后一行将抛出NullPointerException。这是什么解决方案?每次我想调用时,检查getActivity()是否为null?
编辑:即使我们尝试这个,也可以获得一个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的第一次调用,从我们检查活动是否为null到我们最后一次引用它的15行左右,它就不再存在了。
我现在没有logcat,但这就是正在发生的事情。我们自己并没有真正看到这个,但这是一个应用程序,这个函数每天被调用数千次,所以有可能偶尔发生在某人身上。
编辑2:我目前正在做的是尝试和捕捉NPE,如果失败则不做某事。然而,这似乎是解决问题的一种丑陋方式 - 我想知道是否有更好的解决方案!
答案 0 :(得分:1)
在顶部调用getActivity一次并将其保存在变量中。为什么称它为20次,当它之间不会发生变化时(如果确实如此,使用旧的和新的混合可能真的很糟糕)。