对复合对象的 LiveData 的更改
Changes to LiveData of composite objects
我想确保我正确理解 LiveData
的 Observer
的 onChanged
方法何时被调用。
假设我们有一个 object A
有一些原始类型
(一些整数,一些字符串等)和一个 object B
作为字段。
我知道调用setValue
时调用了onChanged
。我很确定当 A
的原始字段发生变化时,或者当我将对象字段重新分配给新实例时,它也会被调用,并且当我更改任何 B
时它不会被调用的字段。
如有错误请指正。
这些规则是否也适用于从 Room 获取的 LiveData
对象?
还有其他情况会调用onChanged
吗?
事实是 LiveData
的 Observer
的 onChanged
方法仅在使用 [= 设置 LiveData
的包含值时调用14=] 或 postValue()
方法。没有机制可以观察 LiveData
持有的对象内部的字段。因此,通过更改 object-A
中字段的值,不应通知观察者。
另一方面,如您所知,Room 提供的查询数据库的方法能够 return LiveData<SomeType>
而不是 SomeType
。在后台,Room 在您的查询的 table(s) 上创建并注册一个 ContentObserver
以了解其中的变化。因此,每次数据发生变化时,Room 都会使用提到的 ContentObserver
得到通知,然后再次获取查询结果并 post 它在 LiveData
.
我想确保我正确理解 LiveData
的 Observer
的 onChanged
方法何时被调用。
假设我们有一个 object A
有一些原始类型
(一些整数,一些字符串等)和一个 object B
作为字段。
我知道调用setValue
时调用了onChanged
。我很确定当 A
的原始字段发生变化时,或者当我将对象字段重新分配给新实例时,它也会被调用,并且当我更改任何 B
时它不会被调用的字段。
如有错误请指正。
这些规则是否也适用于从 Room 获取的 LiveData
对象?
还有其他情况会调用onChanged
吗?
事实是 LiveData
的 Observer
的 onChanged
方法仅在使用 [= 设置 LiveData
的包含值时调用14=] 或 postValue()
方法。没有机制可以观察 LiveData
持有的对象内部的字段。因此,通过更改 object-A
中字段的值,不应通知观察者。
另一方面,如您所知,Room 提供的查询数据库的方法能够 return LiveData<SomeType>
而不是 SomeType
。在后台,Room 在您的查询的 table(s) 上创建并注册一个 ContentObserver
以了解其中的变化。因此,每次数据发生变化时,Room 都会使用提到的 ContentObserver
得到通知,然后再次获取查询结果并 post 它在 LiveData
.