java - android会为了释放内存而杀死单例吗?
问题描述
我有一个非常奇怪的问题,很难描述,所以请仔细阅读答案之前的假设,以避免跳入我已经知道的东西不是
1 - 我有一个从我的服务器登录的 android 应用程序
2 - 成功登录后,我实例化一个Singleton API,它将在活动之间共享,以便向服务器发出请求
3 - 无法使用没有登录的应用程序
4 - 在我的登录活动中,我的状态非常干净
if(APIFacade.getInstance() != null){
startActivity(new Intent(this,MainActivity.class));
finish();
}else {/*error handling*/}
startActivity
5 -整个LoginActivity
类中只有一个方法调用,因此MainActivity
如果不检查外观是否为空就无法启动 6 -实例化后
无法设置APIFacade.INSTANCE
为null
但即使有所有这些条件,有时用户会NullPointerException
在MainActivity
应用程序尝试在登录后首次调用 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自然会为活动做这件事,但是单身人士呢?如果是的话,我能做些什么来解决它?
解决方案
好吧,由于一篇很棒的文章,我自己找到了答案:https ://medium.com/@davethomas_9528/please-dont-use-singletons-to-persist-state-on-android-7bac9bc78b29
简而言之:
大家都说android上的singleston是和应用生命相关的,所以只有应用被kill才会释放
这是真实的
您没有听到的是,应用程序可以在没有用户交互的情况下被 SO 杀死(为前台应用程序释放内存),在这种情况下,当用户尝试返回您的应用程序时,它将从上次使用的活动重新启动,而不是从启动器活动。
推荐阅读
- azure-devops - 如何更改 azure devops 脚本执行路径
- php - 如何正确地将 PHP 对象转换为数组并删除其中的元素?
- asp.net - 我可以将基于 Azure 无服务器功能的应用转换为传统的 asp.net 吗?
- javascript - 以编程方式提交重力表
- python - 从视频/图像中提取检测到的对象
- python - 如何通过 tkinter 在 Python 中检查多项选择(复选框)?
- python - 在python中循环并将数据写入csv文件
- c++ - 生产者消费者程序中的段错误
- sql-server - SQL Server:如何删除架构级联其所有对象?
- assembly - 汇编中的浮点异常 [NASM]