2012-04-25 4 views
0

나는 이것을 혼란스럽게 생각합니다. 안드로이드를 시작하고 객체를 하나로 모으기 위해 여러 가지 활동이 필요한 긴 형식을했습니다. 나는 물건을 물건에서 물건으로 옮기고 싶다. 많은 게시물과 블로그 및 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로서 누락 된 근본적인 규칙이 있다는 느낌을 가지고 있습니다.

답변

1

일반적인 패턴은 정적 필드에 싱글 톤 클래스에 대한 참조를 넣는 것입니다. 정적 필드는 특정 인스턴스에 묶여 있지 않으므로 JVM 프로세스가 살아있을 때까지 고정되어 있습니다. 얼마나 많은 액티비티가 액세스하는지는 중요하지 않습니다. 싱글 톤을 '재활용'해야한다면, 실제로 싱글 톤을 사용할 필요가 없습니까? 또는 명시적인 close()/open() 등의 메소드를 제공하십시오.

+0

덕분에 본래의 질문이보다 구체적으로 업데이트되었습니다. 나는 아직도 조금 혼란 스럽다. –

+0

Java 및 Android에서 객체에 대한 액세스 가능 참조가없는 경우 객체는 가비지 수집 (GC) 만받습니다. static 필드는 정적 필드에 무엇인가 붙이고 결코 지우지 않으면 ('null'으로 설정) 정적 필드는 항상 접근 가능하기 때문에 GC-ed되지 않습니다. 싱글 톤의 경우에는 괜찮습니다. 일반적으로 접근 가능하고 GC로 작성되지 않기를 원하기 때문입니다. 메모리에 관해서는, 그것을 소모 할 수있는 많은 방법이 있습니다 : 목록을 작성하고 새로운 객체를 루프에 추가하기 만하면됩니다. 결국 메모리 부족 오류가 발생하고 프로세스가 종료됩니다. –

0

당신의 싱글 톤이 재활용되지 않는 이유는 안드로이드에서의 활동이 그들이 생각할 때 파괴되지 않기 때문이라고 생각합니다.

'활동 A에서 B로 이동하면 어떻게됩니까?'와 같은 질문을 던집니다. 하지만 Android에서이 작업을 수행하면 활동 A는 거의 이 (가)으로 파괴됩니다. 보통은 onPause() 상태로 들어갑니다. 따라서 사용자가 뒤로 버튼을 눌러 활동 A로 돌아 가기로 결정한 경우 활동 A는 (대부분) 그대로 유지됩니다.

관련 문제