对复合对象的 LiveData 的更改

Changes to LiveData of composite objects

我想确保我正确理解 LiveDataObserveronChanged 方法何时被调用。

假设我们有一个 object A 有一些原始类型 (一些整数,一些字符串等)和一个 object B 作为字段。

我知道调用setValue时调用了onChanged。我很确定当 A 的原始字段发生变化时,或者当我将对象字段重新分配给新实例时,它也会被调用,并且当我更改任何 B 时它不会被调用的字段。

如有错误请指正。 这些规则是否也适用于从 Room 获取的 LiveData 对象? 还有其他情况会调用onChanged吗?

事实是 LiveDataObserveronChanged 方法仅在使用 [= 设置 LiveData 的包含值时调用14=] 或 postValue() 方法。没有机制可以观察 LiveData 持有的对象内部的字段。因此,通过更改 object-A 中字段的值,不应通知观察者。

另一方面,如您所知,Room 提供的查询数据库的方法能够 return LiveData<SomeType> 而不是 SomeType。在后台,Room 在您的查询的 table(s) 上创建并注册一个 ContentObserver 以了解其中的变化。因此,每次数据发生变化时,Room 都会使用提到的 ContentObserver 得到通知,然后再次获取查询结果并 post 它在 LiveData.