这个Android示例是否可以安全使用,内存泄漏?

时间:2013-12-18 23:07:58

标签: android memory-leaks android-fragments

在阅读Fragments时,我在communicating with the activity上看到了这一部分,其中包含以下代码段:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnArticleSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
    }
}

不知怎的,我觉得片段不应该包含对Activity的引用,但我真的不知道这种直觉来自何处。

我觉得当setRetainInstance()设置为true时,上面的代码会导致内存泄漏,因为Activity可能会在保留Fragment时重定向更改,包含对旧Activity的引用。 (这是真的吗?)

但是这种模式可以安全地使用setRetainInstance()设置为false吗?

2 个答案:

答案 0 :(得分:1)

只需清除on分离方法中的指针即可。

@Override
public void onDetach() {
    super.onDetach();

    mListener = null;
}

答案 1 :(得分:1)

  

不知怎的,我觉得片段不应该包含对其Activity的引用,

他们已经做到了。否则,getActivity()方法无效。

  

当setRetainInstance()设置为true时,我觉得上面的代码可能会导致内存泄漏,因为在保留Fragment时,Activity可能会在方向更改时重新启动,包含对旧Activity的引用。 (这是真的吗?)

对于新活动,

onAttach()将再次被调用,所以当你非常简短地泄漏内存时,我不会担心它。