2011-04-20 121 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对象来存储数据通常不是一种合理的设计方法。