让应用程序使用LiveData和ViewModel for UI来观察存储库中的数据更新。
工作正常。现在有人提出“ LiveData尚未被很好地采用,也许应该切换到使用协程的频道”。
首先,不确定有关LiveData的陈述是否正确。我敢肯定,协程的功能可以在没有LiveData的情况下完成。但是我觉得每个人都有自己的目标任务,从Google的语音/示例中,LiveData是使用Android体系结构组件构建的,用于诸如在数据存储库和UI之间提供实时数据通道的情况。
该频道是kotlin的语言功能。当然可以在许多情况下使用它。我只是希望不是因为它已命名为“ channel”,所以人们觉得比这里使用LiveData更合适。
一个不太合适的示例是,消息总线/事件队列是否也适合在使用LiveData的地方使用?也可以订阅/观察它们。
只是没有足够有力的证据表明LiveData在这种情况下更适合使用,或者协程通道更好,而不是非常了解通道。
任何人都想分享一些想法?
答案 0 :(得分:5)
LiveData和Kotlin协程是完全不同的概念。实际上,您应该同时使用两者。无论数据来自何处,LiveData都将UI与数据绑定。协程可以替代线程,这是处理并发的更好方法。
LiveData和协程互不依赖,但是概念很棒,最好同时使用它们。查看liveData协程生成器功能,该功能有助于优雅地结合这两个概念。有关更多详细信息,请参见Use Kotlin coroutines with Architecture components。
答案 1 :(得分:0)
您可以将两者一起使用,实时数据以观察者模式工作,以提供UI与数据存储库之间的绑定。协程用于后台进程,例如从db加载数据或从api获取数据。但是问题是成功完成后如何通知UI或将Kotlin协程函数结果返回给UI线程。 当前,我们大多数人都通过引入支持属性(创建单独的Mutable字段并传递不可变字段getter)来实现这一目标
但是现在有了Kotlin扩展(LifecycleScope)的支持,我们可以轻松地将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类中,我们可以使用Lifescope扩展名简单地调用此函数
lifecycleScope.launchWhenStarted {
newsViewModel.getNews()?.observe(this@NewsActivity, Observer { pagedNewsList -> pagedNewsList.let { newsAdapter.submitList(pagedNewsList) } })
}