0

如果我在片段中有以下代码:

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,如果失败则不做任何事情。然而,这似乎是解决问题的一种丑陋方式——我想知道是否有更好的解决方案!

4

1 回答 1

1

在顶部调用一次 getActivity 并将其保存在变量中。为什么要调用它 20 次,因为它不会在两者之间发生变化(如果确实如此,那么使用新旧混合可能真的很糟糕)。

于 2012-11-15T20:11:55.387 回答