微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rx Java Android 中的困惑

如何解决Rx Java Android 中的困惑

我是 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,6)
        .subscribe { value ->
            Log.i("TEST","$value")
        }
        .dispose()

Observable.just(1,"$value")
        }

谁能解释一下这条链内部发生了什么

解决方法

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

另一方面,如果你删除

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

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

如果你只删除 dispose() 那么没有什么能阻止 Observable 发出它的内容,即使它在 io 上执行

,
  • Observable.just(1,2,3,4,5,6) -> Just 运算符将项转换为发出这些项的 Observable。
  • subscribeOn() -> 操作符告诉源 Observable 哪个线程发送和推送项目一直到观察者
  • observeOn() -> 它将使用该调度器切换和传递剩余的(下游)操作的排放
  • subscribe() -> 运算符返回一次性对象。您应该将此对象分配给变量或 CompositeDisposable 对象。当您的 Activity 或 Fragment 结束生命周期时,所有一次性物品都应该被处理(使用 dispose() 方法)以避免内存泄漏。

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

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

您还可以检查 Kotlin 协程作为 RxJava 的替代方案

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。