细查原因
情况跟第一张图差不多,在项目中存在用全局的静态变量去保留登录信息的情况,然后在老机子上容易出现闪退,在首页刷新也无法更新数据,只能重新登录。
我带着我的猜测走进了百度。
安卓系统会优先回收静态变量?这解释好像挺合理,而且给出的解决方案也很合理,这就是最终的结果了么?
不,我是一个多想的人,加上总觉得哪里不太对,我又多查询了点资料,结果如下。
Android static object lifecycle
Stack Overflow 的解答如下:
安卓系统会优先回收静态变量,这一表诉不对,根据文中所诉,全局变量会一直存在,直到遇上类卸载,虚拟机挂了或进程挂了这三种情况才会消失。
所以会发生这一情况,准确的来说是静态变量所处的进程挂了,然后又重启了,然而因为没有走登录流程,那些静态变量没有被正确初始化,就有了 null 和 0 这种情况。
寻求最优解
保存用户信息,通常就下面这三种,至于 Sqlite 这个轻量级数据库,小项目一般用不上。
- SharedPreferences (稳定,程序挂了照样可以读出来,但是存取会多消耗一点时间)
- 全局静态变量
- 自定义类继承 Application 设置属性
2,3 吧,就是系统内存不够时会挂掉你活动,等你用的时候再重启,导致数据丢失(变成默认初始化的值),这一点我有体验,用UC浏览器看小说,切出去看了一眼微信,结果再回来,网页重新加载了,内存紧张,导致app不是挂在后台,而是“挂”了。为了避免这个现象,不能用它们来保存用户信息。
为何Android开发中不推荐使用static全局变量传参
1 吧,简单信息 例如 token 都是用它,但不能烂用,烂用就是 oom,anr 警告。然后存放较大的数据会导致 sp 读取变慢,也就是说 SharedPreferences 主要存放一些简单的信息。有的文章说腾迅开源组件 MMKV 很快。当然咱小项目没这个必要。
终上所述,最优解出来了,全局的简单状态保存使用 SharedPreferences 我试了下,简单信息基本不耗时间。