gpt4 book ai didi

android - 使用 Kotlin 扩展函数将 RxJava Observables 转换为实时数据

转载 作者:IT老高 更新时间:2023-10-28 13:31:18 26 4
gpt4 key购买 nike

我一直在使用 LiveDataReactiveStreams.fromPublisher() 库在我的代码中使用大量的 RxJava Observables 转换为 LiveData。所以我想为 RxJava Observable 添加一个扩展函数,以便轻松地将它们转换为 LiveData

这些是我的扩展功能:

fun <T> Flowable<T>.toLiveData() :  LiveData<T> {
return LiveDataReactiveStreams.fromPublisher(this)
}

fun <T> Observable<T>.toLiveData(backPressureStrategy: BackpressureStrategy) : LiveData<T> {
return LiveDataReactiveStreams.fromPublisher(this.toFlowable(backPressureStrategy))
}

fun <T> Single<T>.toLiveData() : LiveData<T> {
return LiveDataReactiveStreams.fromPublisher(this.toFlowable())
}

fun <T> Maybe<T>.toLiveData() : LiveData<T> {
return LiveDataReactiveStreams.fromPublisher(this.toFlowable())
}

fun <T> Completable.toLiveData() : LiveData<T> {
return LiveDataReactiveStreams.fromPublisher(this.toFlowable())
}

我的问题是:

  1. 这是个好主意吗?
  2. 有更好的方法吗?
  3. 这些扩展功能会更好吗?

附言

我是 Kotlin 的新手,所以我问这些问题。任何有帮助的都将不胜感激。非常感谢。

最佳答案

简而言之:


我认为这是个好主意。 LiveData 的示例优势是直接在数据绑定(bind)布局中使用它的能力。假设在您的 View 模型中您有:

val user: LiveData<User>

data class User(val firstName: String, val lastName: String)

在您的布局中,您可以绑定(bind) User 的属性直接:

android:text="${viewModel.user.firstName}"

您不能像这样在数据绑定(bind)中使用响应式(Reactive)流。如果 userFlowable<User> , 引用 ${viewModel.user.firstName}不会工作。

此外,如果您的 Activity 或 fragment 调用 ViewDataBinding.setLifecycleOwner(LifecycleOwner) ,数据绑定(bind)将为您处理生命周期(仅在 Activity 状态下观察更改并在更改发生时更新 View ) :

binding.setLifecycleOwner(this)

用于转换的CompletableLiveData<T>对我来说真的没有意义,因为它永远不会通知观察者任何事情,所以我只是摆脱它。

从 react 流转换为实时数据时有一些注意事项(就像我想 resume a countdown after rotation 时一样),但我认为它们与您提供的扩展功能无关,这些似乎可以完成他们的工作.这里要记住的问题是,当生命周期所有者从 Activity 状态变为非 Activity 状态时, PublisherLiveData 取消对流的订阅,当状态变为 Activity 状态时,它将创建一个新的订阅,这意味着在很多情况下重新启动流(我猜那是如果流是“冷”的),而您可能想要恢复旋转或其他配置更改后的流。另一方面,如果流是“热的”,则在非 Activity 状态期间会忽略排放。我认为即使您直接使用 react 流并手动处理生命周期,也必须解决这个问题。但问题是简单地将 react 流转换为 LiveData不足以解决这个问题。

最好将这些方法记录为不处理错误状态,这必须在上游处理。或者,这可能是这些函数的改进之一——首先转换流以处理错误(例如,作为具有默认值的 lambda 参数)。另一种可能性是使用 Result (目前是实验性的),或类似封装成功或错误的东西。


作为事后的想法,关于我上面写的这部分:

There are some considerations when converting from reactive streams to live data, but I don't think they are related to the extension functions you presented.

我仍然认为它总体上是正确的,但是我不确定你是否真的想使用 Single.toLiveData()Maybe.toLiveData()在实践中大部分时间。从 MaybeSingle正在建模一次性操作,那么当没有 Activity 的观察者时最好不要取消它,并且一旦有新的 Activity 观察者就必须重新启动它。相反,张贴到一些 MutableLiveData并处理 Single/MaybeonCleared可能有用(我不确定可以封装在扩展函数中)。它们可能还有一些我目前看不到的用途。

顺便说一下,您的Flowable.toLiveData()已经在 androidx.lifecycle:lifecycle-reactivestreams-ktx artifact .

这留下了Observable.toLiveData() ,我认为它应该和 Flowable 一样有用一个。

关于android - 使用 Kotlin 扩展函数将 RxJava Observables 转换为实时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49122299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com