gpt4 book ai didi

android - 数据绑定(bind)会从实现 Observable 的 ViewModel 中注销监听器吗?

转载 作者:行者123 更新时间:2023-12-04 10:13:20 25 4
gpt4 key购买 nike

我的 ViewModel 提供的数据有一些更复杂的逻辑。到 UI,因此只需通过 LiveData 公开数据不会为我做这项工作。现在我在 Android 中看到了 docs我可以实现Observable在我的ViewModel获得我需要的细粒度控制。

但是在文档中它还说:

There are situations where you might prefer to use a ViewModel component that implements the Observable interface over using LiveData objects, even if you lose the lifecycle management capabilities of LiveData.



内置的Android数据绑定(bind)有多智能?它会在必要时自动取消注册它的监听器(例如,在 View 被破坏的配置更改中),这样我就不必关心丢失的生命周期功能了吗?还是我必须观看 View 的生命周期并取消注册它的听众? (=手动做 LiveData 通常为我做的事情)。

最佳答案

How intelligent is the built-in Android data binding? Will it automatically unregister it's listeners when necessary (e.g. on configuration changes where the View is destroyey) so that I don't have to care about the lost lifecycle capabilities? Or do I have to watch the Lifecycle of the View and unregister it's listeners? (=do manually what LiveData normally does for me).



所以我做了一些测试。我实现了 androidx.databinding.Observable在我的 ViewModel并使用以下日志调用进行了配置更改:
override fun removeOnPropertyChangedCallback(
callback: androidx.databinding.Observable.OnPropertyChangedCallback?) {
Log.d("APP:EVENTS", "removeOnPropertyChangedCallback " + callback.toString())
}

override fun addOnPropertyChangedCallback(
callback: androidx.databinding.Observable.OnPropertyChangedCallback?) {
Log.d("APP:EVENTS", "addOnPropertyChangedCallback " + callback.toString())
}

我看到了 addOnPropertyChangedCallback每次在布局绑定(bind)表达式中引用我的 View 模型时都会调用它。我一次也没看到 removeOnPropertyChangedCallback调用。我最初的结论是 AndroidX 数据绑定(bind)是愚蠢的,并且不会自动删除监听器。
仅供引用:回调类型是 ViewDataBinding.WeakPropertyListener

但是,我偷看了 ViewDataBinding.java source code发现使用的是 Weak References添加监听器。

所以这意味着,在配置更改时,Android OS 应该能够垃圾收集您的 Activity/Fragment,因为 viewmodel 没有强引用。

我的建议:不要添加样板来取消注册听众。 Android 不会在配置更改时泄露对您的 Activity 和 fragment 的引用 .

现在,如果您选择不使用 LiveData ,考虑让你的 View 模型实现 LifecycleObserver这样当您的 Activity/Fragment 进入 Activity 状态时,您可以重新发出最新的值。这是您因不使用 LiveData 而失去的关键行为。 .否则,您可以使用 PropertyChangeRegistry.notifyCallbacks() 发出通知。如您在其他时间共享的文档中所述。不幸的是,我认为这只能用于通知所有属性。

另一件事......虽然我没有验证行为,但源代码似乎表明弱引用用于 ObservableField。 , ObservableList , ObservableMap , ETC。
LiveData有几个不同的原因:
  • The documentation for LiveData.observe 表示对观察者和生命周期所有者都持有强引用,直到生命周期所有者被销毁。
  • LiveData发射不同于 ObservableField . LiveData将在任何时候发出 setValuepostValue调用时不考虑值是否实际改变。 ObservableField 的情况并非如此.因此,LiveData可以通过多次设置相同的值来发送一些“伪事件”。可以在 Conditional Navigation page 上找到一个有用的示例。其中多次登录失败会触发多个 snackbar 。
  • 关于android - 数据绑定(bind)会从实现 Observable 的 ViewModel 中注销监听器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61209725/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com