android LiveData 或协程通道

android LiveData or coroutines channel

让应用程序将 LiveData 与 ViewModel 结合使用 UI 以观察存储库中的数据更新。

它工作正常。现在有人提出了 "LiveData has not been well adopted, maybe it should be switch to use coroutines' channel".

首先不确定关于LiveData的说法是否准确。我确信通过协程的功能,它可以在没有 LiveData 的情况下完成。但我觉得每个人都有它的目标任务,从Google的speech/sample开始,LiveData是用Android架构组件构建的,用于在数据之间提供实时数据通道等情况存储库和 UI。

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

一个不太合适的示例是,消息 bus/event 队列是否也适合用于使用 LiveData 的地方?它们也可以是 subscribed/observed.

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

有人愿意分享一些想法吗?

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

LiveData和coroutines互不依赖,但是概念很好,最好两者都用。查看 liveData coroutine builder function, which helps to gracefully join the both concepts. See Use Kotlin coroutines with Architecture components 了解更多详情。

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

来实现这一点

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

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

就像这是一个使用协程和 returning 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 class 我们可以简单地使用 lifescope 扩展调用这个函数

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