V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
insomnia1232
V2EX  ›  Android

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

  •  
  •   insomnia1232 · 2020-03-20 18:02:55 +08:00 · 10031 次点击
    这是一个创建于 1736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 Fragment 里用 ViewModel, 构造参数传 Fragment 不传 activity, 然后无论 Fragment 和 Activity 谁 destroy 了 ViewModel 都不会走 onCleared()
    9 条回复    2020-03-22 14:42:16 +08:00
    domosekai
        1
    domosekai  
       2020-03-20 18:07:34 +08:00
    viewmodel 的存在不就是为了 activity destroy 的时候他可以活着吗?
    boileryao
        2
    boileryao  
       2020-03-20 18:36:29 +08:00
    看源码就好了(逃
    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
       2020-03-20 22:26:25 +08:00 via Android
    @domosekai 你真用过吗? viewmodel 在 activity 因为配置更改重建的时候会活着 正常 destroy 会 clear
    insomnia1232
        4
    insomnia1232  
    OP
       2020-03-20 22:28:25 +08:00 via Android
    @boileryao 我觉得很可能是 bug, github 上有人提这个,然后说是 28 修复了,然后下面有人回复说 2020 年了问题还在…
    insomnia1232
        5
    insomnia1232  
    OP
       2020-03-20 22:34:21 +08:00 via Android
    @boileryao 而且源码里这部分其实机制有点复杂,FragmentActivity 里会有一个叫 FragmentManagerViewModel 的东西, 通过 Fragment 注册的 viewmodel 会储存在这玩意里面,然后 Activity destroy 的时候这玩意会 clear 掉,但是里面储存的 viewmodel 并没有调用 onClear
    john6lq
        6
    john6lq  
       2020-03-21 01:03:51 +08:00 via iPhone
    我都还没了解 viewmodel, fragment 套 fragment 就已经让我崩溃了,生命周期是真难管理。
    crayygy
        7
    crayygy  
       2020-03-21 07:49:17 +08:00 via iPhone
    构造参数传 Fragment 是什么意思?有没有可能是有 leak 呢
    我们项目中用的 Koin 来注入 ViewModel 的,我看到的 log 都是会在结束的时候调用到 onClear,虽然有别的问题但跟你这个应该不同。
    hyyou2010
        8
    hyyou2010  
       2020-03-21 10:17:54 +08:00
    destroy 跟 finish 是一回事吗?是不是后者才收回 viewmodel ?
    ysy950803
        9
    ysy950803  
       2020-03-22 14:42:16 +08:00
    应该是 Bug,这个行为明显和绑定 Activity 的 ViewModel 不一致吧。Activity 销毁时,都是会走 onClear 的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:15 · PVG 20:15 · LAX 04:15 · JFK 07:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.