2011-04-20 3 views
9

응용 프로그램이 백그라운드로 이동하면 내 (정적 및 싱글 톤) 개체가 지워집니다. 그래서이 객체들을 Applicaton Context에 저장하려고했습니다. 다음 코드를 사용하고 있습니다.ApplicationContext에 개체 저장

Accounts.create (getApplicationContext())는 계정 인스턴스를 저장하기 위해 한 번 호출됩니다.

Application Context에 개체를 저장하는 것이 가능합니까 (신뢰할 수 있습니까)? 다음 방법이 옳은지 확실하지 않습니다. ...

public class Init extends Application { 
    private Hashtable<Object, Object> globalStore = new Hashtable<Object, Object>(); 

    public void putToGlobalStore(Object key, Object value) { 
     globalStore.put(key, value); 
    } 

    public Object takeFromGlobalStore(Object key) { 
     return this.globalStore.get(key); 
    } 

    public void removeFromGlobalStore(Object key) { 
     this.globalStore.remove(key); 
    } 

    public boolean containsInGlobalStore(Object key) { 
     return this.globalStore.containsKey(key); 
    } 
} 

public class Accounts { 

     protected Accounts(String name, Context context) { 
      Init init = (Init) applicationContext; 
       init.putToGlobalStore(name, this); 
     } 

     private static Init applicationContext; 

     public static void create(Context context) { 

      if (context instanceof Application) 
       applicationContext = (Init) context; 
      else 
       applicationContext = (Init) context.getApplicationContext(); 

      if (applicationContext.containsInGlobalStore(GLOBAL_NAME)) 
       Logger.log("Warning " + GLOBAL_NAME 
         + " is already created. This will remove all old datas"); 

      new Accounts(GLOBAL_NAME, applicationContext); 


     } 

     private static final String GLOBAL_NAME = "accounts"; 

     public static Accounts getInstance() { 

      try { 
       return (Accounts) applicationContext 
         .takeFromGlobalStore(GLOBAL_NAME); 
      } catch (Exception e) { 
       Logger.log("GLOBAL_NAME Lost"); 
       return null; 
      } 

     } 

도와주세요.

답변

11

당신은 애플리케이션 컨텍스트 자체가 파괴됩니다 것을 알아야한다. 따라서 앱이 백그라운드 일 때 정적 및 싱글 톤 객체가 지워지지 않을 것이라는 보장은 없습니다. 대신에 개체를 수시로 (플랫 파일 또는 공유 환경 설정 또는 데이터베이스에서) 유지하고 Application 클래스의 onCreate 메서드로 복원하십시오.

1

Application clas s는 영구적이지 않습니다.

응용 프로그램 프로세스가 종료되면 응용 프로그램 클래스 개인 멤버 변수의 데이터가 손실됩니다. 백그라운드에서 오랫동안 사용하지 경우

Using Shared Preferences.

+0

응답 해 주셔서 감사합니다. 내가 필요한 것은 그것이 실행될 때 응용 프로그램을 통해 데이터를 저장하는 것입니다. –

2

내 응용 프로그램에서이 메서드를 사용했습니다. 내 프로세스가 OS에 의해 종료되지 않거나 내 애플리케이션에 크래시가 발생하고 앱이 다시 시작되지 않는 한 어떤 문제도 보지 못했습니다.

저장하는 모든 데이터가 프로그램의 유효 기간에만 유효하다고 생각하는 경우 Application 개체의 OnCreate를 재정의하고 거기에 모든 단일 항목을 작성하는 것이 좋습니다. 이렇게하면 앱이 작동하기 전에 항상 애플리케이션에 모든 싱글 톤이 있는지 확인할 수 있습니다.

+0

예 응용 프로그램의 onCreate()에서 초기화를 수행하고 있습니다. 그러나 애플이 배경에있을 때마다 개체의 인스턴스 (계정)가 표시되지만 개체에 저장된 모든 데이터가 지워집니다. 흥미로운 점은 모든 장치가 아닌 2.3.3에서이 문제를 시뮬레이트 할 수 있다는 것입니다. –

+1

이미 시도해 보았을 지 모르겠지만, 만약 당신이 onDestroy 메소드를 오버라이드하지 않고, 파괴되고있다. 또한 onCreate에 몇 가지 로깅을 추가하고 해시 테이블 등에서 계정 객체를 저장하는 메소드에 추가하십시오. 또한 한 가지 더 관련이 없지만이 객체가 다중 스레드에서 사용되는 경우 HashMap 대신 ConcurrentHashMap을 사용하십시오 . 기꺼이 도와 주려는 와트를 알려주세요 :) – Naresh

0

저는이 질문이 오래전에 물었다는 것을 알고 있습니다. 그러나 여기에 데이터를 저장하기 위해 Application 객체를 사용하는 것이 일반적으로 건전한 설계 방법론이 아니라고 제안하는 good article가 있습니다.

관련 문제