Rx Java在Android中引发的困惑

3

我是新手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已经太迟了。 - akarnokd
2个回答

2
当你写下 .subscribeOn(Schedulers.io()) 时,这意味着 Observable 将在 io 线程上运行,这将需要进行线程切换,从而导致一些延迟。当它发生时,你已经调用了 dispose() 方法,该方法会处理 Observable,因此你不会收到任何输出。
另一方面,如果你删除
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

这意味着Observable将在调用线程上运行,因此不需要进行线程切换,因此您可以在执行dispose()方法调用之前接收完整的输出。
如果只删除dispose(),那么即使在io上执行,也无法阻止Observable发出其内容。

-1
  • 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协程作为RxJava的替代方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接