我有一个包含许多活动的Android应用程序。 我有一个包含我的主数据模型的单例类,所有活动都可以访问以获取数据。
问题是有时候android GC会决定在应用程序在后台(当你按下主页按钮时)销毁我的单身人士。 无论如何,我可以绕过这个吗?
答案 0 :(得分:1)
我当前的应用程序中存在这个确切的问题,需要在各种“单例”中保留大量数据。类。我遇到的问题与你的情况一样;即,有时当将应用程序带回到前台时,一些静态单例'课程已被销毁。
我认为问题在于“生命周期”。这些类的类别永远不能很好地定义或预测。毕竟,这是一个坐在那里的班级,他们持有自己的引用,所以当系统想要获取一些资源时,它很容易被垃圾收集。
您可能已经意识到扩展android.app.Application
是使用传统单身人士的众所周知的替代方案。对我有用的解决方案是将数据单例类的实际实例保存在android.app.Application
的扩展类中,其生命周期已明确定义。任何其他想要访问这些单例的类都可以使用Application
类中的getter获取它们。
例如,我有一个名为AppState
的类,它扩展了Application
,用于保存实例:
import android.app.Application;
public class AppState extends Application {
...
// "Singleton" instances that this Application extension looks after
private MSData singletonInstanceMSData;
public AppState() {
...
singletonInstanceMSData = new MSData();
...
// ---------------- Singleton instance control ----------------
public MSData getMSData(){
return singletonInstanceMSData;
}
// I also provide the means to 'reset' the instances on startup (this is
// something I need to do for my application - you may or may not need to)
public void resetControllerSpecificData(){
singletonInstanceMSData.reset();
...
如果您延长Application
,请不要忘记您需要修改清单。
答案 1 :(得分:1)
AFAIR,lifeespan os singleton是他的类加载器的生命周期 - 也是完整的VM。当用户点击主页按钮时,你的应用程序进入backgorund并且可能被破坏 - 你不能对它做任何事情。你最好的办法就是保存你的onPause()回调中必要的东西(或者如果你真的偏执,只需在每次更改数据时使用写入)