发现一个 ViewModel 的问题,不知道是 bug 还是 feature? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
insomnia1232

发现一个 ViewModel 的问题,不知道是 bug 还是 feature?

  •  
  •   insomnia1232 Mar 20, 2020 13686 views
    This topic created in 2228 days ago, the information mentioned may be changed or developed.
    在 Fragment 里用 ViewModel, 构造参数传 Fragment 不传 activity, 然后无论 Fragment 和 Activity 谁 destroy 了 ViewModel 都不会走 onCleared()
    9 replies    2020-03-22 14:42:16 +08:00
    domosekai
        1
    domosekai  
       Mar 20, 2020
    viewmodel 的存在不就是为了 activity destroy 的时候他可以活着吗?
    boileryao
        2
    boileryao  
       Mar 20, 2020
    看源码就好了(逃
    androidx.activity.ComponentActivity 和 androidx.fragment.app.Fragment 都实现了 LifecycleOwner 和 VIewModelStoreOwner,但是只有 Activity 注册了 ondestroy 在非 configration change 情况下调用 ViewModelStore 的 clear 方法来 clear ViewModel。

    ======

    综上,
    自己加回调,可以参考 ComponentActivity 的构造函数:fragment.getLifecycle().addObserver(...)
    或者构造 ViewModel 的时候传 Activity
    insomnia1232
        3
    insomnia1232  
    OP
       Mar 20, 2020 via Android
    @domosekai 你真用过吗? viewmodel 在 activity 因为配置更改重的时候会活着 正常 destroy 会 clear
    insomnia1232
        4
    insomnia1232  
    OP
       Mar 20, 2020 via Android
    @boileryao 我觉得很可能是 bug, github 上有人提这个,然后说是 28 修复了,然后下面有人回复说 2020 年了问题还在…
    insomnia1232
        5
    insomnia1232  
    OP
       Mar 20, 2020 via Android
    @boileryao 而且源码里这部分其实机制有点复杂,FragmentActivity 里会有一个叫 FragmentManagerViewModel 的东西, 通过 Fragment 注册的 viewmodel 会储存在这玩意里面,然后 Activity destroy 的时候这玩意会 clear 掉,但是里面储存的 viewmodel 并没有调用 onClear
    john6lq
        6
    john6lq  
       Mar 21, 2020 via iPhone
    我都还没了解 viewmodel, fragment 套 fragment 就已经让我崩溃了,生命周期是真难管理。
    crayygy
        7
    crayygy  
       Mar 21, 2020 via iPhone
    构造参数传 Fragment 是什么意思?有没有可能是有 leak 呢
    我们项目中用的 Koin 来注入 ViewModel 的,我看到的 log 都是会在结束的时候调用到 onClear,虽然有别的问题但跟你这个应该不同。
    hyyou2010
        8
    hyyou2010  
       Mar 21, 2020
    destroy 跟 finish 是一回事吗?是不是后者才收回 viewmodel ?
    ysy950803
        9
    ysy950803  
       Mar 22, 2020
    应该是 Bug,这个行为明显和绑定 Activity 的 ViewModel 不一致吧。Activity 销毁时,都是会走 onClear 的。
    About     Help     Advertise         API     FAQ     Solana     3595 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 04:39 PVG 12:39 LAX 21:39 JFK 00:39
    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