在阅读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
吗?
答案 0 :(得分:1)
只需清除on分离方法中的指针即可。
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
答案 1 :(得分:1)
不知怎的,我觉得片段不应该包含对其Activity的引用,
他们已经做到了。否则,getActivity()
方法无效。
对于新活动,当setRetainInstance()设置为true时,我觉得上面的代码可能会导致内存泄漏,因为在保留Fragment时,Activity可能会在方向更改时重新启动,包含对旧Activity的引用。 (这是真的吗?)
onAttach()
将再次被调用,所以当你非常简短地泄漏内存时,我不会担心它。