[android] 各位大佬怎么处理 静态变量被回收 这种情况

2017-04-25 22:11:48 +08:00
 ittianyu

一般来说当应用退到后台后,内存不足的情况下,会销毁 Activity 甚至 Service ,静态变量也是如此。 对于稍微大点的项目来说,难免用到静态全局变量,然而一旦静态变量被清空,就很容易出现空指针异常。

我的设想: 通过静态方法来访问静态变量,并在应用启动后做个静态标记 如果调用的时候,发现静态变量为空,并且静态标记被清空了,就重启应用。(好像记得微信如果退到后台很久后,回来会从欢迎页面开始)

也看到有人说在 Activity 的 onSaveInstanceState 中保存,然后恢复。我觉得界面太多,容易遗漏,如果添加一个新的静态变量,估计还得修改 n 遍,不合适。

虽然我是 《 app 开发从上架到上吊》 的铁粉,但活还得继续干。期待各位大佬的表现。

6594 次点击
所在节点    问与答
12 条回复
billlee
2017-04-25 22:34:54 +08:00
静态变量不可能被回收的,难道你的变量突然变成了悬空引用?一定是你的程序逻辑有问题,在某些启动的代码路径上没有对静态变量进行初始化。
尽量少用静态变量,如果一定要用,最好在声明的地方直接初始化。
TakWolf
2017-04-26 03:23:54 +08:00
在 Android 中,静态变量被收回 = 应用进程被回收了,你可以理解成 jvm 都没了。

不用想的很复杂,需要长久保存的数据,直接存到 sharedpreferences 里面,如果频繁读取,再用静态变量去做个内存缓存
ittianyu
2017-04-26 08:23:04 +08:00
@billlee
@TakWolf
自行百度 /谷歌 安卓 静态变量 被回收
不是逻辑有问题,从登录后就初始化了,退到后台,打开几个其他的应用,再次进去, Activity 就重新创建了,而静态变量值被清空了。
rogerchen
2017-04-26 09:11:07 +08:00
@ittianyu 不就是重新初始化了?系统要你死你还能不死? http://stackoverflow.com/questions/1944369/android-static-object-lifecycle
mind3x
2017-04-26 09:16:07 +08:00
@TakWolf 说的没错,是你的进程被干掉又重建了才会有你观察到的所谓静态变量被回收,不只是 activity 被重建。
另外,我早些年是写 JVM 的,所以不用叫我自行百度哈 😂
AndyWing520
2017-04-26 10:07:24 +08:00
如果静态变量会在正常运行过程中被回收,那还叫静态变量吗
Activity 也是个 Object ,被回收也不会导致内部的静态变量被回收
被回收(你说的清空现象)只会出现在 2 种情况
1.代码逻辑导致某处逻辑清空
2.静态变量所处的进程被干掉然后又被你重启了,但是没有赋值
TakWolf
2017-04-26 10:40:34 +08:00
你这种人,真不想回复你
ittianyu
2017-04-26 12:12:51 +08:00
@mind3x
@AndyWing520
测试了好几遍,按 HOME 退到后台,疯狂开其他应用,然后在 Android Monitor 可以看到其实应用的进程已经挂了,通过 HOME 回到应用,发现并不会走 Splash 界面,重新创建了上次退出的界面,这个时候,之前在 Splash 界面 设置的 静态变量被清空了。有什么好办法直接重启应用,重新走一遍初始化流程。
ittianyu
2017-04-26 12:32:57 +08:00
@TakWolf 不好意思,我只是个智商低情商低的渣渣实习生,多有冒犯,还请谅解。
mind3x
2017-04-26 13:25:42 +08:00
@ittianyu 进程级别需要初始化的,在你的 Application 的 onCreate 里搞。另外你需要弄清楚各组件的 life cycle 。
ittianyu
2017-04-26 13:48:11 +08:00
@mind3x 感谢热心解答,登录这种操作放到 application 里不合适,我在想想其他办法。
AndyWing520
2017-04-27 20:31:47 +08:00
@ittianyu "通过 HOME 回到应用,发现并不会走 Splash 界面,重新创建了上次退出的界面" 这是正常的,因为通过 recentsapp 去切换是指定了上次的 activity 的,你的进程可能是因为低内存导致的回收吧,也可能是 rom 的一些后台杀进程的机制,所以这个进程的所有变量(无论是静态还是非静态)都是回收的,想在被杀回后再切换回来时候可以显示 splash 界面可以通过 check 一些静态变量的值然后做跳转(?或者其他显示行为)操作

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/357347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX