是否有必要拯救单身人士?

时间:2014-05-25 10:39:07

标签: android singleton lifecycle

问题:

我在一个单独的类中保存了一些数据......有时它会发生,这个单例会返回我从中导出的空数据,它被销毁了......

我的想法/想法:

实际上,我认为,只要应用程序存在,单例就会存在,只要应用程序记住其他任何东西,例如片段状态,我的单例也会存在它的最后数据。这不正确吗?

具体问题:

我的情况如下:我从我的主片段转到子片段并在我的单身中保存一个选定的对象...我停止使用我的应用程序并在一段时间后回来。我的应用程序记住它的状态并重新创建片段,我的片段想从我的单例中获取所选对象并获得null。

我认为,只要应用程序存在就应该存在单例,因此不需要保存...每当应用程序结束时,无论如何都不会恢复任何内容,我的应用程序也不会记住任何内容,所以无论如何都没关系。这是一个错误的假设吗?

我需要回答这个问题,因为如果我确定,上述想法是正确的,我至少知道,我必须在其他地方寻找问题......

1 个答案:

答案 0 :(得分:8)

这是我发现(或已经忘记)

的短暂总结
  • 虽然应用程序已被销毁,但可以重新创建活动
  • 如果没有从某个地方进行参考,单身人士可以被垃圾收集

所以你必须拯救你的单身人士!否则,只要您的手机处于内存不足状态,它就可能会终止应用程序并创建一个新应用程序,但会重新开始活动......

对我而言,由于我实际上总是使用片段的单个活动,因此很容易解决问题:

  • 当我创建一个活动时,我称之为静态恢复功能(在调用get !!!之前)
  • 在活动的onSaveInstanceState中,始终将单例保存到包

=>所以我的单身人士看起来像跟随(基础结构)

public class DataCache implements Parcelable
{
    private static final String TAG = DataCache.class.getName();
    private static DataCache mCache = null;

    public static synchronized final DataCache get()
    {
        if (mCache == null)
            mCache = new DataCache();
        return mCache;
    }

    private DataCache()
    {
        // init...
    }

    public void save(Bundle outState)
    {
        outState.putParcelable(TAG, this);
    }

    public static void restore(Bundle savedInstanceState)
    {
        if (savedInstanceState != null && savedInstanceState.containsKey(TAG))
        {
            // only restore, if necessary, i.e. if application was destroyed but activity saved our last cache
            if (mCache == null)
                mCache = savedInstanceState.getParcelable(TAG);
        }
    }
}