当从背景返回应用程序时,有时在单例内保存的静态数据为空

时间:2013-11-21 12:28:25

标签: android android-activity android-fragments static singleton

我使用经典的单例模式来存储我在初始活动(splash活动)中从webServices获取的数据,然后在整个应用程序中访问它。

我有一个启动活动导致MainActivity,它是带有片段的滑动菜单活动,初始片段是一个包含支持地图片段的片段。

我的问题是存储在单例内的数据,有时当应用程序进入后台(按下主页并转移到另一个应用程序)然后转到最近的应用程序并选择我的应用程序时,单例的数据为空,这会导致我的应用程序崩溃。

我花了几个小时检查我的单例是否按原样编写,如果我自己没有使静态数据变为null,那么静态数据变为null的可能原因是什么。

在我的搜索之后,我找到了一个非常简单的解释,解释了静态数据何时/为何变为空 - Android static object lifecycle @Samuh回答我引用

“因此,如果您创建一个Android应用程序并初始化一个静态变量,它将保留在JVM中,直到发生以下情况之一: 1.班级已卸下 2. JVM关闭 3.过程死了“

关于#1和#2 - 我真的不知道这些何时发生。

关于#3 - 这非常好,好像用户将从“最近的应用程序”中点击我的应用程序,这将调用我的情况“启动活动”中的启动器活动,这将从服务器获取数据(最新)将它再次存储在我的单身内 - 完美! ,这正是我的其他应用程序中发生的事情,区别在于我没有使用滑动菜单和片段,只有活动。在我的情况下,从后台返回将不会调用启动器Activity,它是“启动画面”,但会调用MainActivity(主滑动菜单活动)以及初始片段,当我尝试从我的单例中访问数据时所有数据在它内部是null,单例本身不是null,因为在片段的onCreate()我使用getInstance()。我相信这意味着单例丢失了,现在重新创建,里面没有数据,所以如果进程是为什么我没有回到发射器活动?

希望有人可以提前帮助,谢谢。

我的单身人士课程:

 public class MySingleton {
  // some private data members with getters/setters
  private String x,y,z;

      // the instance
  private static MySingleton theInstance = null;

      //private ctor 
      private MySingleton(){
          //doing something 
      }

      //get instance
      public static synchronized MySingleton getInstance() {

     if (theInstance == null)
        theInstance = new MySingleton ();
     return theInstance;
   }
 }

1 个答案:

答案 0 :(得分:2)

你的单身人士被系统杀死,一般是因为它需要记忆,或者因为这个过程可能太旧了。

我建议你:

- 例如,在您的单例中保存数据,例如在共享的首选项中,因此可以根据需要轻松地重新创建。它通常工作正常 - 通过覆盖Activity中的OnSaveInstanceState来保存变量,并在重新创建时恢复它们。