我有一个包含许多活动的 android 应用程序。我有一个单例类,其中包含我的主要数据模型,所有活动都可以访问该模型以获取数据。
问题是有时android GC决定在后台应用程序时销毁我的单例(当您按下主页按钮时)。无论如何我可以绕过这个吗?
我有一个包含许多活动的 android 应用程序。我有一个单例类,其中包含我的主要数据模型,所有活动都可以访问该模型以获取数据。
问题是有时android GC决定在后台应用程序时销毁我的单例(当您按下主页按钮时)。无论如何我可以绕过这个吗?
我在我当前的应用程序中遇到了这个确切的问题,它需要在各种“单例”类中保留大量数据。我遇到的问题和你的情况一样;即,有时当将应用程序带回前台时,一些静态“单例”类已被破坏。
我认为,问题在于此类课程的“生命周期”永远无法很好地定义或预测。毕竟,它是一个持有对自身的引用的类,所以当系统想要获取一些资源时,它很容易被垃圾收集。
您可能已经知道扩展android.app.Application
是使用传统单例的众所周知的替代方法。对我有用的解决方案是将数据单例类的实际实例保存在 的扩展类中android.app.Application
,其生命周期已明确定义。任何其他想要访问这些单例的类都可以使用Application
类中的 getter 来获取它们。
因此,例如,我有一个名为AppState
extends的类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
。
AFAIR,lifespan os singleton 是他的类加载器的寿命 - 也是完整的 VM 。当用户点击主页按钮时,您的应用程序进入后台并可能被破坏 - 您无法对它做任何事情。你最好的选择是在你的 onPause() 回调中保存任何必要的东西(或者如果你真的偏执,就在每次更改 datza 时使用 write through)