나는 이것을 혼란스럽게 생각합니다. 안드로이드를 시작하고 객체를 하나로 모으기 위해 여러 가지 활동이 필요한 긴 형식을했습니다. 나는 물건을 물건에서 물건으로 옮기고 싶다. 많은 게시물과 블로그 및 Android Dev 페이지를 읽은 후에는 비 영구적 인 데이터 인 것처럼 보입니다. 가장 좋은 방법은 애플리케이션을 하위 클래스로 만들거나 싱글 톤을 만드는 것입니다. 나는이 게시물 openFileOutput not working properly inside a singleton class - ideas/workarounds?을 검토했고 지금 나의 질문은 왜 싱글 톤이 재활용되지 않는 걸까요? Activity A에서 Singleton()을 만든 다음 Activity B로 이동하면 싱글 톤에 대한 참조가 전달되지 않습니다. 가비지 리사이클러는 우리가 다시 돌아올 것이라고 어떻게 알 수 있습니까? 활동 A가 재활용 될 때 우리는android에서 왜 싱글 톤은 재활용되지 않습니까?
우리는 다음 싱글을 보면 ..
public final class SomeSingleton implements Cloneable {
private static final String TAG = "SomeSingleton";
private static SomeSingleton someSingleton ;
private static Context mContext;
/**
* I'm private because I'm a singleton, call getInstance()
* @param context
*/
private SomeSingleton(){
// Empty
}
public static synchronized SomeSingleton getInstance(Context context){
if(someSingleton == null){
someSingleton = new SomeSingleton();
}
mContext = context.getApplicationContext();
return someSingleton;
}
public void playSomething(){
// Do whatever
mContext.openFileOutput("somefile", MODE_PRIVATE); // etc...
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("I'm a singleton!");
}
}
.. 싱글이 죽을 활동 B로 이동 한 것을 나에게 보인다 그리고 우리는의 인스턴스를 생성 getInstance()를 통해 클래스는 클래스의 단일 인스턴스를 정적 필드 someSingleton에 배치합니다. 이 인스턴스가 왜 재활용되지 않습니까? 대답이 "정적 필드는 절대로 재활용되지 않습니까?" 우리가 그 중 많은 것들을 가지고 있다면 우리는 우리의 모든 기억을 사용하지 못하게합니까? 간단한 설계 고려 사항? 얼마나 많은 정적 필드가 존재하는지 전혀 알지 못하는 공헌 된 많은 라이브러리를 사용한다면 이것은 위험한 것처럼 보입니다. 나는 OOP에서 newb로서 누락 된 근본적인 규칙이 있다는 느낌을 가지고 있습니다.
덕분에 본래의 질문이보다 구체적으로 업데이트되었습니다. 나는 아직도 조금 혼란 스럽다. –
Java 및 Android에서 객체에 대한 액세스 가능 참조가없는 경우 객체는 가비지 수집 (GC) 만받습니다. static 필드는 정적 필드에 무엇인가 붙이고 결코 지우지 않으면 ('null'으로 설정) 정적 필드는 항상 접근 가능하기 때문에 GC-ed되지 않습니다. 싱글 톤의 경우에는 괜찮습니다. 일반적으로 접근 가능하고 GC로 작성되지 않기를 원하기 때문입니다. 메모리에 관해서는, 그것을 소모 할 수있는 많은 방법이 있습니다 : 목록을 작성하고 새로운 객체를 루프에 추가하기 만하면됩니다. 결국 메모리 부족 오류가 발생하고 프로세스가 종료됩니다. –