安卓全局静态变量中的坑

细查原因

情况跟第一张图差不多,在项目中存在用全局的静态变量去保留登录信息的情况,然后在老机子上容易出现闪退,在首页刷新也无法更新数据,只能重新登录。
我带着我的猜测走进了百度。
在这里插入图片描述
在这里插入图片描述
安卓系统会优先回收静态变量?这解释好像挺合理,而且给出的解决方案也很合理,这就是最终的结果了么?
不,我是一个多想的人,加上总觉得哪里不太对,我又多查询了点资料,结果如下。
Android static object lifecycle
Stack Overflow 的解答如下:
在这里插入图片描述
安卓系统会优先回收静态变量,这一表诉不对,根据文中所诉,全局变量会一直存在,直到遇上类卸载,虚拟机挂了或进程挂了这三种情况才会消失。
所以会发生这一情况,准确的来说是静态变量所处的进程挂了,然后又重启了,然而因为没有走登录流程,那些静态变量没有被正确初始化,就有了 null 和 0 这种情况。

寻求最优解

保存用户信息,通常就下面这三种,至于 Sqlite 这个轻量级数据库,小项目一般用不上。

  1. SharedPreferences (稳定,程序挂了照样可以读出来,但是存取会多消耗一点时间)
  2. 全局静态变量
  3. 自定义类继承 Application 设置属性

2,3 吧,就是系统内存不够时会挂掉你活动,等你用的时候再重启,导致数据丢失(变成默认初始化的值),这一点我有体验,用UC浏览器看小说,切出去看了一眼微信,结果再回来,网页重新加载了,内存紧张,导致app不是挂在后台,而是“挂”了。为了避免这个现象,不能用它们来保存用户信息。
为何Android开发中不推荐使用static全局变量传参
在这里插入图片描述

1 吧,简单信息 例如 token 都是用它,但不能烂用,烂用就是 oom,anr 警告。然后存放较大的数据会导致 sp 读取变慢,也就是说 SharedPreferences 主要存放一些简单的信息。有的文章说腾迅开源组件 MMKV 很快。当然咱小项目没这个必要。

终上所述,最优解出来了,全局的简单状态保存使用 SharedPreferences 我试了下,简单信息基本不耗时间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值