应用程序字段可以变为空吗?

时间:2013-02-18 18:15:23

标签: android android-lifecycle

在我的Android应用中,我设置了一个自定义的应用程序派生类。在其中我有一个成员字段来存储一些任意对象。

所以我有:

public class MyApp extends Application {

public static MyApp mInstance;
public Object mData;

@Override
public void onCreate() {
   mInstance = this;
}

public void setData(Object data) {
    mData = data;
}

public Object getData() { return mData; } 

}

现在我正在做一个Activity

public doSetData() {

     someMyData = ....
     MyApp.mInstance.setData(someMyData);

}

在另一个Activity我正在做

@Override
public void onCreate(Bundle) {

     Object myDataRetrieved = MyApp.mInstance.getData();

}

我可以看到有时候myDataRetrievednull。但是,我相信我从未在null中通过MyApp.setData()。当然,我可能是错的。

然而,是否存在MyApp.mData单独变为空的情况?

3 个答案:

答案 0 :(得分:2)

  

然而,是否存在MyApp.mData本身变为空的情况?

不确定。每次Android终止该过程时都会发生这种情况,当您的应用程序不在前台,Android需要RAM,并且您的应用程序接下来要终止时,就会发生这种情况。

答案 1 :(得分:0)

您永远无法保证您的数据会保留在内存中,因为系统始终可以收回资源以回收资源。

因此,您的应用程序必须始终准备好在onSaveInstanceState()(短期)或onPause()(长期)中保存任何持久性数据,然后检索它在onCreate()。

也就是说,还有我非常喜欢的“单身模式”。这是一种软件设计模式,您可以在其中创建一个特殊类来保存持久数据。只有一次类的实例(因此名称为“singleton”),它是在第一次需要数据时按需创建的。保留单例,以便持久数据的任何后续需求只使用相同的对象,而无需从长期存储中重新加载数据。只要系统没有收获您的流程,数据始终存在,访问成本几乎为零。如果系统 收割您的流程,则会透明地重新加载数据,并且您的应用程序永远不会注意到差异。

有关单身人士的实施,请参阅https://stackoverflow.com/a/14779357/338479

答案 2 :(得分:0)

如果实例被销毁,只需保存您的数据并将其加载到应用程序对象创建上,这将始终在活动之前创建。

如果你最小化内存使用,那么它将在beg清除之前在android zygote中存活更长时间。 saveinstancestate等仅适用于小数据块。通过应用实例共享数据是可以的,有时也会推荐,但它与使用静态字段没有什么不同。同样的限制适用。

如果你想要最少的内存使用,那么不推荐使用parcels等来保存你的数据,甚至不是谷歌。