[android] 各位大佬怎么处理 静态变量被回收 这种情况 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ittianyu
V2EX    问与答

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

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

    一般来说当应用退到后台后,内存不足的情况下,会销毁 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
    AndWing520  
       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     Solana     971 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:24 PVG 07:24 LAX 15:24 JFK 18:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86