【问题标题】:Does android kill singleton in order to free memory?android会为了释放内存而杀死单例吗?
【发布时间】:2018-09-12 05:58:27
【问题描述】:

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

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

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

}else {/*error handling*/}

5 - 在整个 LoginActivityclass 中只有一个对 startActivity 方法的调用,因此如果不检查外观是否为空,就无法启动 MainActivity
6 - 实例化后无法将APIFacade.INSTANCE 设置为null

但即使有所有这些条件,当应用在登录后尝试首次调用 API 时,有时用户会在 MainActivity 上得到 NullPointerException

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 自然会为活动做这件事,但是单身人士呢? 如果是,我能做些什么来解决它?

【问题讨论】:

  • 你用的是什么单例?
  • Application.onCreate() 总是在应用程序进入前台时被调用,所以尝试在那里初始化INSTANCE

标签: java android nullpointerexception singleton


【解决方案1】:

感谢一篇精彩的文章,我自己找到了答案:https://medium.com/@davethomas_9528/please-dont-use-singletons-to-persist-state-on-android-7bac9bc78b29

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

这是真的

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

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2021-07-19
    • 2012-01-07
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多