insomnia1232
V2EX  ›  Android

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

  •  
  •   insomnia1232 · Mar 20, 2020 · 13757 views
    This topic created in 2247 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   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2965 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 14:12 · PVG 22:12 · LAX 07:12 · JFK 10:12
    ♥ Do have faith in what you're doing.