【问题标题】:Confusion in Rx Java AndroidRx 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 到那时为时已晚。

标签: android kotlin rx-java


【解决方案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 的替代方案

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多