无法使用 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 / RxJava中的Flowable?