在我的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();
}
我可以看到有时候myDataRetrieved
是null
。但是,我相信我从未在null
中通过MyApp.setData()
。当然,我可能是错的。
然而,是否存在MyApp.mData
单独变为空的情况?
答案 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等来保存你的数据,甚至不是谷歌。