android LiveData 或协程频道



让应用程序使用LiveData和ViewModel for UI来观察存储库中的数据更新。

它工作正常。现在有人提出了"LiveData 还没有被很好地采用,也许应该切换到使用协程的通道"。

首先,不确定关于LiveData的陈述是否准确。我相信使用协程的功能可以在没有 LiveData 的情况下完成。 但我觉得每个人都有其有针对性的任务,从谷歌的语音/样本来看,LiveData 是使用 Android 架构组件构建的,用于在数据存储库和 UI 之间提供实时数据通道等情况。

该频道是 kotlin 的一项语言功能。当然,它可以在很多情况下使用。我只是希望这不是因为它命名了"频道",所以人们觉得这比在这里使用 LiveData 更合适。

一个不太合适的示例是,消息总线/事件队列是否也适用于使用 LiveData 的地方?它们也可以被订阅/观察。

只是没有非常有力的证据来证明在这种情况下使用 LiveData 更好,或者协程通道更好,不太了解通道。

任何人都愿意分享一些想法?

LiveData 和 Kotlin 协程是完全不同的概念。实际上,您应该同时使用两者。LiveData 将 UI 与数据绑定,无论数据来自何处。协程是线程的替代方法,它只是处理并发的更好方法。

LiveData 和协程不相互依赖,但概念很棒,最好同时使用它们。查看 liveData 协程生成器函数,它有助于优雅地连接这两个概念。有关更多详细信息,请参阅将 Kotlin 协程与架构组件一起使用。

它们的使用方式大致相同,但是Channel将启用顺序形式的项目集合,并且LiveData可以有多个观察者。

因此,如果您有一些流程需要通知每个发送的事件的多个参与者,则不能为此目的使用通道。

您可以同时使用两者,实时数据在观察者模式上工作,以提供 UI 和数据存储库之间的绑定。协程适用于后台进程,例如从数据库加载数据或从 API 获取数据。但问题是如何在成功完成后通知 UI 或将 Kotlin 协程函数结果返回给 UI 线程。 目前,我们大多数人都是通过引入支持属性来实现这一点的(创建单独的可变字段并传入不可变字段getter)

但是现在有了 Kotlin 扩展(Lifecycle Scope)的支持,我们可以轻松地将 LiveData 与 Coroutine 连接起来。

androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01 or higher.

像这是一个使用协程并返回 LiveData 的函数

/**
* Get all news rows livedata pageList from DB using Coroutine.
*/
suspend fun getAllNewsLiveData(): LiveData<PagedList<News>> {
return withContext(Dispatchers.IO) {
val data = mDao.getAllNews()
LivePagedListBuilder(data, Constants.PAGINATION_SIZE).build()
}
}

现在在 UI 类中,我们可以简单地使用生命范围扩展调用此函数

lifecycleScope.launchWhenStarted {
newsViewModel.getNews()?.observe(this@NewsActivity, Observer { pagedNewsList -> pagedNewsList?.let { newsAdapter.submitList(pagedNewsList) } })
}

最新更新