Android - getActivity和Activity生命周期

时间:2012-11-15 20:09:19

标签: android android-activity

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

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

1 个答案:

答案 0 :(得分:1)

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