无法使用 RxKotlin 'observeOn' 主线程

Posted

技术标签:

【中文标题】无法使用 RxKotlin \'observeOn\' 主线程【英文标题】:Cant 'observeOn' main thread with RxKotlin无法使用 RxKotlin 'observeOn' 主线程 【发布时间】:2017-09-19 17:59:35 【问题描述】:

我正在尝试使用以下方法在主线程上观察 observable:

    // Kotlin Code
    Observable
      .observeOn(androidSchedulers.mainThread())

但我收到以下错误:

    Type Mismatch:
      Required: rx.Scheduler!
      Found: io.reactivex.Scheduler!

我订阅的 Observable 来自一个用 Java 编写的库,因此使用了 RxJava。

我是不是很愚蠢,错过了什么?我很困惑:$

提前致谢:)

【问题讨论】:

github.com/ReactiveX/RxAndroid/issues/348 这可能有帮助吗?您的 rx 相关导入是什么? 谢谢,@Ascorbin。那个问题帖子确实有帮助,我意识到我使用的库导入了“rx.Observable”,所以我将其更改为“io.reactivex.Observable”,但这并没有解决问题。 【参考方案1】:
  Required: rx.Scheduler!

Required 表示签名为Observable.observeOn(rx.Scheduler)

  Found: io.reactivex.Scheduler!

Found 表示签名为io.reactivex.Scheduler AndroidSchedulers.mainThread()

这意味着Observable 是 RxJava 1 的 observable,而使用的 RxAndroid 版本是为 RxJava 2 构建的。既然您提到 observable 是由库提供的,这意味着该库是使用 RxJava 1 构建的。

您有 3 个选项来解决此问题:

    确定相关库是否有 RxJava 2 版本,或者自己将这些更新贡献给项目。 使用akarnokd/RxJava2Interop 将旧的Observable 转换为RxJava 2。(RxJavaInterop.toV2Observable(Observable);) 将其他依赖项切换回 RxJava 1。

【讨论】:

感谢清晰的解释!奇怪的是,我将库升级到 RxJava2,问题仍然存在。 RxJava 和 RxJava 2 使用完全不同的包,所以如果 RxJava 1 仍然可用,只需添加 RxJava 2 作为依赖项不会改变任何事情。 是的,我知道,我也将导入从“rx.Observable”切换到“io.reactivex.Observable”。仍然没有成功:( 如果其他人在使用 Retrofit 时收到此错误,这篇文章有助于解决改造 RxJava1 到 RxJava2 错误***.com/questions/43434073/…【参考方案2】:

1.添加:

   //RX JAVA
    implementation "io.reactivex.rxjava3:rxjava:3.0.0-RC6"

    implementation "io.reactivex.rxjava2:rxandroid:2.0.2"

2.编写这段代码:

  val taskObservable: Observable<Task> = Observable.fromIterable(DataSource.createTaskList())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

    

3.添加这些导入:

import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Function
import io.reactivex.schedulers.Schedulers

注意:

如果你使用的是 KOTLIN,那么最好使用 RX Kotlin! 只需在 build.gradle 中添加两行:

//rxkotlin
    implementation "io.reactivex.rxjava2:rxkotlin:2.4.0"
    implementation "io.reactivex.rxjava2:rxandroid:2.0.2"

【讨论】:

【参考方案3】:

请将此包含在您的 gradle 导入中

rxandroid_version="2.0.1"

implementation "io.reactivex.rxjava2:rxandroid:$rxandroid_version"

将此添加到您的项目中

import io.reactivex.android.schedulers.AndroidSchedulers

【讨论】:

【参考方案4】:

使用

.subscribeOn(io.reactivex.rxjava3.schedulers.Schedulers.io())

【讨论】:

只是一个建议:在使用多个投票解决方案回答旧问题时,请尝试提供更多详细信息以了解原始问题的上下文中的答案。如果可能,还提供文档的链接。

以上是关于无法使用 RxKotlin 'observeOn' 主线程的主要内容,如果未能解决你的问题,请参考以下文章

RXKOTLIN/RXJAVA:使用 Observables 的套接字之间的通信

使用 RxJava、RxKotlin 或 Even Kotlin 协程代替 On Click 监听器的接口有啥好处?

RXKotlin 中的存储库模式连接结果

如何取消订阅RxKotlin / RxJava中的Flowable?

RxKotlin COUNT 与 GROUP BY 并返回一个列表

observable.observeOn() 和公共资源的并发问题