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

Evi*_*arS 9 singleton static android android-fragments android-activity

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

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

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

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

在我搜索之后,我发现了一个非常简单的解释,解释了静态数据何时/为什么变为空--Android静态对象生命周期 @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;
   }
 }
Run Code Online (Sandbox Code Playgroud)

Aer*_*lys 2

你的单例被系统杀死,通常是因为它需要内存,或者因为进程可能太旧了。

我给你的建议是:

-保存单例中的数据,例如在共享首选项中,以便在需要时可以轻松地重新创建它。它通常工作得很好 - 通过重写 Activity 中的 OnSaveInstanceState 来保存变量,并在重新创建时恢复它们。