V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ittianyu
V2EX  ›  问与答

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

  •  
  •   ittianyu · 2017-04-25 22:11:48 +08:00 · 6556 次点击
    这是一个创建于 2767 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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