2013-12-18 57 views
5

當片段閱讀了,我碰到這部分來到communicating with the activity,其中包含下面的代碼片段:這個Android示例是否可以安全使用,內存泄漏?

@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

爲什麼不直接調用((OnArticleSelectedListener)getActivity())。listenerMethod()當你需要它而不是持有對它的引用? – dymmeh

+0

因爲這是Android開發指南中的示例代碼!在碎片分離之後,你可能會得到'NullPoinerException',我想我的問題歸結爲!你能否認爲只要你可以調用回調方法,片段就不會脫離其活動? - 你必須特別注意'AsyncTasks'等。 – Maarten

+2

所以你應該在'onDetach()'中將'mListener'設置回'null'? – Maarten

回答

1

不知怎的,我有碎片不應該包含他們的活動參考的感覺,

他們已經這樣做了。否則,getActivity()方法無法工作。當setRetainInstance()被設置爲真,因爲雖然片段被保持在活動可以在取向變化重啓,含有老的活動的參考

感覺像上面的代碼可引起了內存泄漏。 (這是真的嗎?)

onAttach()將被再次調用,爲新的活動,所以雖然你會非常短暫地泄漏內存,我不會擔心它。

1

只需清除分離方法上的指針即可。

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

    mListener = null; 
}