Rx Java Android 中的困惑

Posted

技术标签:

【中文标题】Rx Java Android 中的困惑【英文标题】:Confusion in Rx Java Android 【发布时间】:2021-09-27 19:38:56 【问题描述】:

我是 rx 新手,有几行代码让我感到困惑:

Observable.just(1,2,3,4,5,6)
        .subscribeOn(Schedulers.io())
        .observeOn(androidSchedulers.mainThread())
        .subscribe  value ->
            Log.i("TEST", "$value")
        
        .dispose()

它不会记录结果,但是当我注释掉 subscribeOn() 和 observeOn() 或 dispose() 时它可以完美运行,如下所示:

Observable.just(1,2,3,4,5,6)
        .subscribe  value ->
            Log.i("TEST", "$value")
        
        .dispose()

Observable.just(1,2,3,4,5,6)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe  value ->
            Log.i("TEST", "$value")
        

有人能解释一下这条链中发生了什么

【问题讨论】:

subscribeOnobserveOn 引入了异步,并在其中引入了事件尚未流动的时间窗口,因此 dispose 可以阻止它发生。如果没有异步,事件会在您重新获得控制权之前立即流动,因此 dispose 到那时为时已晚。 【参考方案1】:

当您编写.subscribeOn(Schedulers.io()) 时,这实质上意味着Observable 将在io 线程上运行,这将需要线程切换导致一些延迟。 当它发生时,您已经调用了 dispose() 方法,该方法处理了 Observable,因此您不会收到任何输出。

另一方面,如果你删除

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

这意味着Observable 将在调用线程上运行,因此不需要线程切换,因此在执行dispose() 方法调用之前您会收到完整的输出。

如果您只删除 dispose(),那么即使在 io 上执行,也不会阻止 Observable 发出其内容

【讨论】:

【参考方案2】: Observable.just(1,2,3,4,5,6) -> Just 运算符将项目转换为发出这些项目的 Observable。 subscribeOn() -> 运算符告诉源 Observable 发射哪个线程并将项目一直推送到 Observer observeOn() -> 它将使用该调度程序切换并传递排放以进行剩余(下游)操作 subscribe() -> 运算符返回 Disposable 对象。您应该将此对象分配给变量或 CompositeDisposable 对象。应在 Activity 或 Fragment 结束生命时处理所有一次性用品(使用 dispose() 方法)以避免内存泄漏。

您可以在此处找到更多信息: https://proandroiddev.com/understanding-rxjava-subscribeon-and-observeon-744b0c6a41ea

http://reactivex.io/documentation/operators.html#creating

您还可以查看 Kotlin Coroutines 作为 RxJava 的替代方案

【讨论】:

以上是关于Rx Java Android 中的困惑的主要内容,如果未能解决你的问题,请参考以下文章

java 基于android.databinding库的原语的一些简单的Rx绑定。这允许您在r中应用,映射,过滤和所有好东西

Android Studio 中的 Smack 让我很困惑

处理 RX 中的 response.body == null

我的 Android 小部件被杀死,“不再需要 bellander.andro ....”

java.lang.RuntimeException: Unable to start activity ComponentInfo{XXX}: Error inflating class andro

Android RxJava使用介绍概念