2011-04-20 166 views
9

當我的應用程序進入後臺時,我的(靜態和單例)對象被清除。 所以我試圖將這些對象存儲在應用上下文。我正在使用下面的代碼。在ApplicationContext中存儲對象

Accounts.create(getApplicationContext())將被調用一次以存儲帳戶實例。

這是可能的(可靠)在應用程序上下文中存儲對象?我不確定以下方法是否正確。請指導..

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

你應該知道,應用程序上下文本身已被破壞,如果閒置在後臺很長一段時間。所以不能保證當應用程序在後臺時你的靜態對象和單例對象不會被清除。相反,你可以做的是不時堅持你的對象(無論是平面文件或共享首選項或數據庫),並在onCreate方法的應用程序類

1

Application clas s不是永久的。

如果App進程死了,Application類私有成員變量數據丟失。

Using Shared Preferences.

+0

感謝您的回覆。我需要的是在運行時將數據存儲在應用程序中 – 2011-04-20 06:28:41

2

恢復它們我一直在我的應用程序中使用此方法我沒有看到任何問題,除非我的進程被操作系統殺死,或者如果我的應用程序崩潰,我的應用程序重新啓動。

如果您認爲您存儲的任何數據只對一個程序的生命週期有效,爲什麼不重寫Application對象的OnCreate並在那裏創建所有的單例。通過這種方式,您可以始終確保您的應用程序在您的應用程序開始運行之前擁有所有單身人士。

+0

是的我正在執行應用程序的onCreate()中的初始化。但在某些時候,當應用程序處於後臺時,我正在獲取對象的實例(例如帳戶),但存儲在對象中的所有數據都已清除。有趣的是,我可以在2.3.3中模擬這個問題,而不是在每個設備中。 – 2011-04-20 07:59:09

+1

您可能已經嘗試了這一點,但是如果您不知道爲什麼不重寫onDestroy方法並添加一些日誌記錄來查看對象何時正在被毀壞。還可以在你的onCreate中添加一些日誌記錄,以及將你的賬戶對象存儲在散列表等中的方法。還有一件事情可能不相關,但如果這個對象是從多線程中使用的,那麼使用ConcurrentHashMap而不是HashMap 。讓我知道你發現高興幫助:) – Naresh 2011-04-20 08:28:15

0

我知道這個問題在很久以前就被問過了,但是這裏有一個good article,建議使用Application對象來存儲數據通常不是一種合理的設計方法。