2012-05-25 2 views
4

:안드로이드 응용 프로그램 수명주기 및 singelton이 패턴을 잘 우리의 가장 친숙한

public class MySingeltone { 

    public String mSomeReferenceTypeData; 
    public int mSomeValueTypeData; 

    private static MySingeltone mInstance; 

    private MySingeltone() { 

    } 

    public static MySingeltone getInstance() { 
     if (mInstance == null) { 
      mInstance = new MySingeltone(); 
     } 

     return mInstance; 
    } 
} 

내 문제는 내가 mInstance 활동 후 같지 널 (null)을 수행하는 것이 최근에 발견 한 그 파괴 된 사용하거나 것입니다

public class SomeActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     MySingeltone mySingeltone = MySingeltone.getInstance(); 
     mySingeltone.mSomeReferenceTypeData = "some value"; 
    } 
} 

활동을 실행하는 모든 응용 프로그램을 닫은 후 "SomeActivity"다음 번에 실행 (10 초 후에 말 ..)에 mInstance 여전히 함께, 동일한 참조를 보유 : 전체 응용 프로그램은 예를 들어, 절 것으로 가정 할 때 그의 분야에서 같은 가치.

왜 그런가요?

무엇이 누락 되었습니까?

안드로이드 가비지 수집 정적 멤버가 응용 프로그램에 속할 때?

+0

여기서 싱글 톤이 동일한 인스턴스인지 확인합니다. –

+0

@ Jazzy Josh : 새로운 것을 설정하기 전에 값을 얻는 것만으로 그것을 볼 수 있습니다.내 예제에서는 getInstance 메서드와 다음 줄 사이에있을 것입니다. 첫 번째 값은 null이 될 것이기 때문에 null과 같지 않은지 확인해야합니다. –

+0

특히 응용 프로그램의 어디에 있는지 의미합니다. 활동이 결코 죽지 않는다면 onDestroy를 거치지 않고 onStop에서 onRestart와 onStart로 이동하여 살해 당할 것이며 귀하의 Singleton은 여전히 ​​살아있을 것입니다. –

답변

5

"mInstance"는 정적 변수이므로 응용 프로그램을 닫을 때 null이 반환되지 않습니다. 응용 프로그램을 종료한다고해서 응용 프로그램이 파괴 된 것은 아닙니다.

Android 앱을 닫는 개념도 없습니다. 앱에서 벗어나면 동시에 파괴되지 않습니다. 안드로이드 OS는 더 이상 사용하지 않을 때 앱을 닫을 때 내부적으로 처리합니다. 메모리 부족의 경우 안드로이드가 앱을 파괴하기로 결정하면이 정적 변수도 null이됩니다.

+3

메모리가 가득 차서 안드로이드 OS가 그의 응용 프로그램을 비우고이 변수가 null이되면이 대답은 틀렸다. 다음 번에 그는 그것을 사용하려고합니다. –

+0

감사를위한 @OfekRon 감사. 답변이 업데이트되었습니다. – rizzz86

2

정확히 Java 객체가 가비지 수집되는시기를 제어 할 수 없습니다. 오브젝트가 더 이상 (비 원형) 참조가 없을 때 오브젝트는 가비지 콜렉션의 대상이됩니다. Android를 사용하면 활동이 메모리에서 제거되는 시점을 제어 할 수 없습니다.

+0

소리 그래서 만약 내가 내 singelton 클래스가 null이 될 것이라고 기대하는 일부 활동을 만들 - 내가 그것을 onDestroy() 메서드 또는 뭔가 그런 null로 설정할 필요가 의미합니까? –

+0

@ Tan Kanel 예. 그러나 싱글 톤이 항상 존재하는 무언가를 대표한다고 가정 할 때 싱글 톤을 파괴하고자하는 것은 이상합니다. 어쩌면 싱글 톤에서 open()/close()/isOpened() 메소드를 대신 사용할 수도 있고 아니면 서비스가되어야 할 수도 있습니다. –

+0

yah, 맞아, 내가하고있는 일이야.하지만 원리에 대해 더 많이 물어 봤어. –

0

왜 그런가요?

무엇이 누락 되었습니까?

안드로이드 가비지 수집 정적 멤버가 응용 프로그램에 속할 때?

처음에는 안드로이드 OS가 독자적으로 응용 프로그램 프로세스의 수명주기를 관리하기 때문에 안타깝게도 다른 응용 프로그램 개념은 없습니다.

둘째, 잘못된 테스트를 수행했습니다. 모든 앱을 닫는 대신 반대되는 작업을하는 경우 - 더 많은 앱을 시작하여 메모리를 채우면 결국 애플리케이션의 메모리가 정리되어 사용됩니다. 다른 응용 프로그램 및 인스턴스 멤버뿐만 아니라 모든 정적 mebers 포함됩니다! 그런 다음 정적 변수가 예상대로 NULL이 될 것입니다.

메모리가 충분하지 않은 경우 응용 프로그램을 정리하지 못할 수도 있습니다.

실제로, 주위에는 방법이 없습니다. 제가 알고있는 한, 객체를 우아하게 할 수있는 방법이 없기 때문에 언제든지 장치 메모리에서 정리할 필요가 없습니다. 어떤 경우에는 나쁜 행동으로 이어집니다. 싱글 톤이 생성시에 처리량이 많은 경우 getInstance를 호출하면 UI가 중단되거나 무책임으로 인해 응용 프로그램이 중단 될 수 있습니다.