어떻게 안드로이드 가비지 컬렉터가 단편에 의해 유지되는 데이터로 작동하는지 궁금합니다 (인스턴스 유지).안드로이드 : 단편 인스턴스 메모리 관리를 유지
나는이 같은 클래스 hirarchy있는 경우 : 조각이 내용을 볼 orientation
변화에 그 recreatd됩니다
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;
}
}
그래서 내가하고 싶은 것은
을. 그러나 기본 데이터 (DataManager
및 데이터)는 다시로드하지 않아야합니다.
DataManager
은 변경 사항을 위해 데이터 객체를 수신하고,이 변경 사항을 UI로 전달합니다 (
Fragment
).
Fragment
은 (재)
DataManager
에 "첨부"됩니다.
지금까지 그렇게 좋았습니다. 그것은 나에게 좋은 솔루션과 잘 구성된 것 같습니다. 기본적으로 어떤 종류의 Model-View-Presenter 패턴입니다.
하지만 안드로이드가 DataManager
및 데이터 객체를 수집하기 위해 가비지 수집기를 실행하면 궁금합니다.
Activity가 MyFragment
인 것으로 가정합니다.
하지만 메모리에 어떤 변화가 생기면 앱 사용자가 다른 활동으로 이동할 때 완전히 다른 것을 표시합니다.
데이터에 DataManager
이라는 참조가 있고 그 반대의 경우도 있으므로 데이터가 "영원히"메모리에 보관됩니다. 맞습니까? 가비지 수집기는 장치가 메모리가 부족한 경우에만이 둘을 제거합니다. 그러나 나는이 두 객체가 자동으로 가비지 수집 된 처음 두 데이터 객체가되지는 않을 것이라고 생각합니다. 어떤 종류의 "메모리 교착 상태"가 있다고 생각합니다.
당신은 어떻게 생각하십니까? 어떤 제안?
이러한 누출을 방지하려면 WeakReference를 사용할 수 있습니다. http://weblogs.java.net/blog/2006/05/04/understanding-weak-references –