【问题标题】:Store Objects in ApplicationContext在 ApplicationContext 中存储对象
【发布时间】:2011-04-20 05:54:13
【问题描述】:

当我的应用程序进入后台时,我的(静态和单例)对象被清除。 所以我尝试将这些对象存储在 Applicaton Context 中。我正在使用以下代码。

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;
            }

        }

请帮忙。

【问题讨论】:

    标签: android


    【解决方案1】:

    您应该知道,如果在后台长时间不使用,应用程序上下文本身会被破坏。因此,当应用程序处于后台时,不能保证您的静态和单例对象不会被清除。相反,您可以做的是不时保留您的对象(在平面文件或共享首选项或数据库中)并在 Application 类的 onCreate 方法中恢复它们

    【讨论】:

      【解决方案2】:

      我一直在我的应用程序中使用这种方法,除非我的进程被操作系统杀死或者我的应用程序崩溃并且我的应用程序重新启动,否则我没有发现任何问题。

      如果您认为您存储的任何数据仅在程序的生命周期内有效,为什么不覆盖 Application 对象的 OnCreate 并在那里创建所有单例。这样,您始终可以确保您的应用程序在您的应用程序开始运行之前具有所有单例。

      【讨论】:

      • 是的,我正在 Application 的 onCreate() 中进行初始化。但是在应用程序处于后台的某个时间之后,我得到了对象的实例(比如帐户),但是存储在对象中的所有数据都被清除了。有趣的是我可以在 2.3.3 中模拟这个问题,而不是在每个设备中
      • 你可能已经尝试过了,但如果你还没有尝试过,为什么不重写 onDestroy 方法并添加一些日志来查看对象何时被销毁。还将一些日志记录添加到您的 onCreate 以及将帐户对象存储在哈希表等的方法中。还有一件事可能不相关,但是如果从多个线程中使用此对象,请使用 ConcurrentHashMap 而不是 HashMap .如果您愿意提供帮助,请告诉我 :)
      【解决方案3】:

      Application class 不是永久的。

      如果App进程被杀,Application类私有成员变量数据丢失。

      Using Shared Preferences.

      【讨论】:

      • 感谢您的回复。我需要的是在应用程序运行时通过应用程序存储数据
      【解决方案4】:

      我知道很久以前就有人问过这个问题,但这里有一个good article,它建议使用 Application 对象来存储数据通常不是一种合理的设计方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        相关资源
        最近更新 更多