当前位置: 首页 > 知识库问答 >
问题:

利用Kotlin扩展函数将RxJava可观测数据转换为实时数据

吕琪
2023-03-14

我使用LiveDatareActiveStreams.FromPublisher()库在代码中使用了大量转换为LiveData的RxJavaObservables。所以我想在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())
}
    null

附注。

我刚认识Kotlin所以我想问这些问题。如有任何帮助,我们将不胜感激。非常感谢。

共有1个答案

闻慎之
2023-03-14

简而言之:

  • flowable.ToLiveData()已在AndroidX中。lifecycle:lifecycle-reactivestreams-ktx项目
  • Observable.ToLiveData()应该很有用
  • single.toLiveData()在实践中可能没有用处
  • 可能.ToLiveData()在实践中可能不有用
  • completable.ToLiveData()实际上没有意义

我觉得这是个不错的主意。LiveData的一个优点是可以直接在数据绑定布局中使用它。假设在您拥有的视图模型中:

val user: LiveData<User>

data class User(val firstName: String, val lastName: String)
android:text="${viewModel.user.firstName}"
binding.setLifecycleOwner(this)

从反应流转换为实时数据时有一些考虑(就像我想在循环后恢复倒计时时那样),但我不认为它们与您提供的扩展函数有关,这些函数似乎起到了作用。这里要记住的问题是,当生命周期所有者从活动状态移动到非活动状态时,publisherlivedata取消对流的订阅,而当状态更改为活动状态时,它将创建一个新的订阅,这意味着在许多情况下重新启动流(我猜是在流为“冷”的情况下),而您可能希望在循环或其他配置更改后从原来的位置恢复流。另一方面,如果流是“热”的,则在非活动状态期间会忽略排放。我认为这个问题必须解决,即使您直接使用反应流和手动处理生命周期。但问题是,仅仅将反应流转换为livedata并不足以解决这个问题。

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

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

从反应流转换为活动数据时有一些考虑因素,但我认为它们与您呈现的扩展函数无关。

我仍然认为它在一般情况下是正确的,但是我不确定您是否真的希望在实践中大多数时候使用single.toLiveData()maybe.toLiveData()。由于maybesingle是对一次性操作进行建模,因此在没有活动观察者时最好不要取消它,而在有新的活动观察者时必须重新启动它。相反,发布到一些mutablelivedata并在oncleared中处理single/maybe可能是有用的(我不确定是否可以封装在扩展函数中)。它们仍然可能有一些用处,但我现在根本看不出来。

顺便说一下,您的flowable.tolivedata()已经在androidx.lifecycle:lifecycle-reactivestreams-ktx工件中。

这使得Observable.ToLiveData(),我认为它应该和flowable一样有用。

 类似资料:
  • 最近,我开始将我的Android项目从Java转换为Kotlin。我在许多类中使用改型从API获取数据。在我的项目中,有很多POJO,我需要手动将它们转换为数据类,因为它与AndroidStudio的自动转换器工具不兼容。 假设我有模型类: 在Kotlin中有没有什么好方法可以直接将这个模型类转换为数据类?这个类可以手动转换,但我有一些类有大量的变量,手动将其转换为数据类会很麻烦。

  • 我正在尝试使用具体化类型的函数作为扩展函数,但我认为这是不可能的,因为在我检查生成的字节码后,我发现方法签名是私有的,有什么办法可以将其公开? CommonExtensions.kt 静态编程语言字节码: 客户代码: 静态编程语言文件 Java档案

  • 数据类似乎是Java中老式POJO的替代品。这些类将允许继承是可以预期的,但我看不到扩展数据类的方便方法。我需要的是这样的东西:

  • 我试着把我的头绕在可观察的物体上。我喜欢Observable解决开发和可读性问题的方式。正如我读到的,好处是巨大的。 HTTP和集合上的可观察对象似乎是直截了当的。我怎样才能把这样的东西转换成可观察的模式呢。 这来自我的服务组件,用于提供身份验证。我希望它能像Angular2中的其他HTTP服务一样工作——支持数据、错误和完成处理程序。 这里的任何帮助都将不胜感激。我唯一的替代解决方案是创建s。但

  • 我尝试为 以下是我的尝试: 问题是IntelliJ抱怨无法智能转换my变量(这是和) 会有一条红色的弯弯曲曲的线,并抱怨它不能智能投射。所以我必须使用 如果你不能复制它,不要担心,我有很多代码——这些是重要的部分。 不同之处在于,像这样的常规方法不需要此位置中的Smart cast。 这意味着我没有在扩展函数中正确实现一些东西。 有人知道我如何修复扩展函数,这样我就不需要使用

  • 我有以下两个场景共享的前奏代码: 现在,我想将df转换为pyspark数据帧(