im想知道androids垃圾收集器如何處理片段保留的數據(保留實例)。Android:片段保留實例內存管理
如果我有一類hirarchy這樣的:
class MyFragment extends Fragment {
private DataManager dataManager;
public MyFragment(){
setRetainInstance(true);
}
public void onCreate(){
if (dataManager == null)
dataManager = new DataManager();
dataManager.setView(this);
}
public void onCreateView(){
// display the data of the dataManager
}
public void onStop(){
dataManager.setView(null);
}
}
class DataManager implements DataChangedListener {
private MyFragment view;
private Data data;
public DataManager(){
data.setDataChangedListener(this);
}
public void setView(MyFragment v){
this.view = v;
}
}
class Data {
public void setDataChangedListener(DataChangedListener l){
this.listener = l;
}
}
所以我想要做的是,在orientation
變化的片段觀看的內容將被recreatd。但底層數據(DataManager
和Data)不能重新加載。 DataManager
監聽數據對象的更改,將會將此更改轉發到UI,即Fragment
。 Fragment
在「重新」創建時「附加」到DataManager
。
到目前爲止這麼好。在我看來,這是一個很好的解決方案,結構良好。基本上它是某種模型 - 視圖 - 演示者模式。
但現在我想知道,當Android將運行垃圾收集器來收集DataManager
和數據對象。
假設我有一個活動,顯示MyFragment
。
但是當應用程序的用戶導航到另一個活動時,內存會發生什麼變化,從而顯示完全不同的內容。
由於DataManager
有一個參考數據,反之亦然,我猜數據將被永久地保存在內存中,對吧? 所以我猜垃圾收集器只會在設備進入低內存的時候刪除它。但我想,這兩個對象不會自動成爲垃圾收集的前兩個數據對象。我猜有一種「內存死鎖」。
您認爲如何?有什麼建議麼?
爲了避免這種泄漏,您可以使用WeakReference:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references – 2013-03-05 09:34:50