首页 > 解决方案 > android会为了释放内存而杀死单例吗?

问题描述

我有一个非常奇怪的问题,很难描述,所以请仔细阅读答案之前的假设,以避免跳入我已经知道的东西不是

1 - 我有一个从我的服务器登录的 android 应用程序
2 - 成功登录后,我实例化一个Singleton API,它将在活动之间共享,以便向服务器发出请求
3 - 无法使用没有登录的应用程序
4 - 在我的登录活动中,我的状态非常干净

if(APIFacade.getInstance() != null){
startActivity(new Intent(this,MainActivity.class));
                        finish();

}else {/*error handling*/}

startActivity5 -整个LoginActivity类中只有一个方法调用,因此MainActivity如果不检查外观是否为空就无法启动 6 -实例化后
无法设置APIFacade.INSTANCEnull

但即使有所有这些条件,有时用户会NullPointerExceptionMainActivity应用程序尝试在登录后首次调用 API 时启动

String url = APIFacade.getInstance().getProfilePicUrl(); //throws nullpointerexception on 5% of the times

APIFacade 类是这样的:

public class APIFacade {
 private static APIFacade INSTANCE = null;

  @WorkerThread
    public APIFacade(Object i, final boolean preLoad) {
        INSTANCE = this;
//other stuff
}

  public static APIFacade getInstance() {
        return INSTANCE;
    }
}

我无法在开发环境中重现该问题,所以我只知道它是由于 firebase 上的 crashlytics 仪表板而发生的......

我相信我的代码没有泄漏导致这种情况,所以我得到的唯一理论是:当我的应用程序进入后台时,Android 正在从内存中清除一些变量......

我知道android自然会为活动做这件事,但是单身人士呢?如果是的话,我能做些什么来解决它?

标签: javaandroidnullpointerexceptionsingleton

解决方案


好吧,由于一篇很棒的文章,我自己找到了答案:https ://medium.com/@davethomas_9528/please-dont-use-singletons-to-persist-state-on-android-7bac9bc78b29

简而言之:
大家都说android上的singleston是和应用生命相关的,所以只有应用被kill才会释放

这是真实的

您没有听到的是,应用程序可以在没有用户交互的情况下被 SO 杀死(为前台应用程序释放内存),在这种情况下,当用户尝试返回您的应用程序时,它将从上次使用的活动重新启动,而不是从启动器活动。


推荐阅读