Android MVVM:当来自网络的数据没有改变时如何避免多个 livedata 触发器

Android MVVM: how to avoid multiple livedata triggers when data from network did not change

我有这个基本的 Android 架构组件用例,我在其中观察实时数据并更新 UI。

 myLiveData.observe(viewLifecycleOwner, Observer {
     // update UI
 })

 // will trigger a network call and update the repository (Room DB)
 myViewModel.refreshDataFromRepository()

通过观察调用,我获得了触发器并更新了 UI,这很好。但是,如果后端数据发生变化,我还需要更新数据库,因此我触发网络刷新并更新数据库并再次触发观察者。所以,我得到了两次数据。

我可以将冲突策略更改为忽略以避免,但我需要将其设置为“替换”,因为数据可能会更改:

@Query("SELECT * FROM my_table ORDER BY timestamp DESC")
fun getMyEntities(): LiveData<List<MyEntity>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun add(myEntity: MyEntity)

其他选项是将网络响应与数据库内容进行比较,避免重写相同的数据,但代价高昂。

有什么办法可以让数据库访问智能化,避免数据没有变化时触发?

您可以使用 distinctUntilChanged,它已添加到转换中:

myLiveData.distinctUntilChanged().observe(viewLifecycleOwner) {
     // update UI
 }