2013-02-18 2 views
0

내 Android 앱에서 맞춤 애플리케이션 파생 클래스를 설정했습니다. 그것에서 나는 몇 가지 임의의 객체를 저장하는 멤버 필드를응용 프로그램 필드가 null이 될 수 있습니까?

을 그래서 난이 있습니다. 하나 Activity에서 지금

public class MyApp extends Application { 

public static MyApp mInstance; 
public Object mData; 

@Override 
public void onCreate() { 
    mInstance = this; 
} 

public void setData(Object data) { 
    mData = data; 
} 

public Object getData() { return mData; } 

} 

내가 난 또 다른 Activity에서

public doSetData() { 

    someMyData = .... 
    MyApp.mInstance.setData(someMyData); 

} 

을하고 있어요

@Override 
public void onCreate(Bundle) { 

    Object myDataRetrieved = MyApp.mInstance.getData(); 

} 

하고 나는 가끔 myDataRetrieved는입니다 볼 수 있습니다. 그러나 나는 결코 nullMyApp.setData()에 건네 준 적이 없다고 생각합니다. 물론, 나는 잘못 될 수 있습니다.

그러나 MyApp.mData이 자체적으로 null이되는 상황이있을 수 있습니까?

+1

직접 참조하지 않고 getData()를 사용할 때 반환하는 값 .... – Pragnani

+0

아, 항상 getData를 사용합니다. 차이가 있습니까? 내가 편집했습니다. –

+0

활동이 파괴되면 모든 필드 값이 손실됩니다. 활동 B에서 활동 A의 데이터를 사용하려면 해당 활동을 의도와 함께 전달하십시오. – m0skit0

답변

2

그러나 MyApp.mData가 자체적으로 null이되는 상황이있을 수 있습니까?

확실히. Android가 프로세스를 종료 할 때마다 발생하며, 앱이 포 그라운드에 있지 않고 Android에 RAM이 필요하며 앱이 다음 번에 종료 될 때 발생합니다.

+1

고맙습니다. 지금은 이해합니다. 그 자료들을 항상 이용할 수있는 좋은 방법이 무엇인지 조언 해 주시겠습니까? 나는 그들을 지켜야합니까? –

+1

@Alex : "나는 그들을 지켜야합니까?" -- 예. 정적 데이터 멤버와 커스텀'Application' 클래스를 캐시로만 사용하십시오. – CommonsWare

0

시스템에서 항상 리소스를 회수하는 프로세스를 얻을 수 있기 때문에 데이터가 메모리에 유지된다는 것을 결코 보장 할 수 없습니다.

따라서, 응용 프로그램이 항상이 중 onSaveInstanceState() (단기) 또는 onPause() (장기)의 모든 영구 데이터를 저장 한 다음에서 onCreate에서이를 검색 할 준비를해야합니다().

그건 그렇고, 내가 좋아하는 "싱글 톤 패턴"도 있습니다. 이는 영구 데이터를 보관하기위한 특별한 클래스를 만드는 소프트웨어 디자인 패턴입니다. 처음으로 데이터가 필요할 때만 생성되는 클래스의 인스턴스 (즉 "싱글 톤")는 한 번만 존재합니다. 싱글 톤은 유지되므로 장기 저장에서 데이터를 다시로드 할 필요없이 영구 데이터에 대한 이후의 모든 요구가 동일한 객체 만 사용하게됩니다. 시스템이 귀하의 프로세스를 거둬 들이지 않는 한, 데이터는 항상 액세스 비용에 거의 제로입니다. 시스템 프로세스를 거치는 경우 데이터가 투명하게 다시로드되며 응용 프로그램은 그 차이를 알지 못합니다.

내 싱글 톤 구현에 대해서는 https://stackoverflow.com/a/14779357/338479을 참조하십시오.

+0

죄송합니다, 싱글 톤이 사용자 정의 응용 프로그램 클래스와 다른 점을 이해하지 못합니다. 사용자 지정 응용 프로그램 클래스도 싱글 톤입니다. 어떻게 든 데이터를 계속 유지하지 않아도된다는 뜻입니까? 이러한 데이터가 항상 동일하게 유지되는 것은 아닙니다. –

+0

맞춤 애플리케이션 클래스는 똑같은 일을 할 수 있습니다. 나는 그들을 사용했습니다. 모두 개인적인 취향의 문제입니다. –

+1

엄밀히 말하자면 어떤 클래스를 싱글 톤으로 만들지는 않습니다. –

0

데이터를 저장하고 인스턴스가 삭제 된 경우 응용 프로그램 개체 생성시로드하십시오.이 개체는 항상 작업 전에 만들어집니다.

메모리 사용을 최소화하면 beig가 제거되기 전에 안드로이드 접합체에서 더 오래 생존합니다. saveinstancestate 등은 작은 데이터 블록에만 유용합니다. app 인스턴스를 통해 데이터를 공유하는 것이 좋습니다. 때로는 권장하지만 정적 필드를 사용하는 것과 다르지 않습니다. 동일한 제약 조건이 적용됩니다.

최소한의 메모리 사용을 원한다면 데이터를 저장하기 위해 소포를 사용하는 것이 좋습니다. Google이 권장하는 것은 아닙니다.