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")
有人能解释一下这条链中发生了什么
【问题讨论】:
subscribeOn
和 observeOn
引入了异步,并在其中引入了事件尚未流动的时间窗口,因此 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中应用,映射,过滤和所有好东西
处理 RX 中的 response.body == null
我的 Android 小部件被杀死,“不再需要 bellander.andro ....”
java.lang.RuntimeException: Unable to start activity ComponentInfo{XXX}: Error inflating class andro