0

在我的 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。但是,我相信我从来没有通过nullMyApp.setData()当然,我可能是错的。

然而,会不会有这样的情况下MyApp.mData会自行变为无效?

4

3 回答 3

2

但是,是否存在 MyApp.mData 本身变为 null 的情况?

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

于 2013-02-18T18:48:01.010 回答
0

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

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

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

有关我的单例实现,请参阅https://stackoverflow.com/a/14779357/338479

于 2013-02-18T19:37:46.630 回答
0

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

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

如果您想要最少的内存使用,那么不推荐使用包裹等来保存您的数据,即使是谷歌也不推荐。

于 2016-05-18T09:20:14.817 回答