android LiveData或协程通道

时间:2019-08-14 22:46:39

标签: android android-architecture-components android-livedata kotlin-coroutines

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

工作正常。现在有人提出“ LiveData尚未被很好地采用,也许应该切换到使用协程的频道”。

首先,不确定有关LiveData的陈述是否正确。我敢肯定,协程的功能可以在没有LiveData的情况下完成。但是我觉得每个人都有自己的目标任务,从Google的语音/示例中,LiveData是使用Android体系结构组件构建的,用于诸如在数据存储库和UI之间提供实时数据通道的情况。

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

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

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

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

2 个答案:

答案 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) } })
    }