微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不跳过事件的情况下监听 ViewModel 中的一系列修改?

如何解决如何在不跳过事件的情况下监听 ViewModel 中的一系列修改?

我有一个 viewmodel,其中包含一个 RecyclerView.Adapter 使用的项目列表。

用户点击其中一项时,可能会发生以下一种或多种情况:

我使用 LiveData 作为表示列表中的一项正在被修改的方式(比告诉整个列表被修改更有效)。但我忘记了 LiveData 可以跳过值。

示例:

// on background thread
mutableModificationEvent.postValue(ModificationEvent(...)) // will be skipped
mutableModificationEvent.postValue(ModificationEvent(...))

做这项工作最合适的方式是什么?

我知道 LiveData#setValue() 存在。但由于 #postValue 可能会跳过值并在某些时候被错误添加代码中,因此我将放弃 LiveData 作为一个选项。

解决方法

您可能会使用反应流之一,例如在 RxJava 或 Kotlin 协程中。以下是 kotlin 流程 (taken from here) 的示例:

val latestNews: Flow<List<ArticleHeadline>> = flow {
    while(true) {
        val latestNews = newsApi.fetchLatestNews()
        emit(latestNews) // Emits the result of the request to the flow
        delay(refreshIntervalMs) // Suspends the coroutine for some time
    }
}

以下是使用流将其转换为 LiveData (link) 的示例:

val user: LiveData<User> = liveData {
  val data = database.loadUser() // loadUser is a suspend function.
  emit(data)
}

我没有试过这个,但看起来上面的流程应该一个一个地发出项目并且不应该跳过任何项目。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。