为了账号安全,请及时绑定邮箱和手机立即绑定

java.lang.IllegalStateException:预计在主线程上调用

java.lang.IllegalStateException:预计在主线程上调用

沧海一幻觉 2023-08-16 10:20:52
我是新来的。我正在尝试使用适用于 Android 的 RxJava 库,但出现错误。逻辑是处理按钮上的点击事件,然后将其映射到从 获取值EditText,然后通过网络将flatmap其解析为值。Single<String>我尝试flatmap使用 IO 线程运行Schedulers.io(),但出现错误:E/MainActivity: Login error    java.lang.IllegalStateException: Expected to be called on the main thread but was RxCachedThreadScheduler-1        at com.jakewharton.rxbinding3.internal.Preconditions.checkMainThread(mainThread.kt:28)        at com.jakewharton.rxbinding3.view.ViewClickObservable.subscribeActual(ViewClickObservable.kt:35)        at io.reactivex.Observable.subscribe(Observable.java:12267)        at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:32)        at io.reactivex.Observable.subscribe(Observable.java:12267)        at io.reactivex.internal.operators.observable.ObservableFilter.subscribeActual(ObservableFilter.java:30)        at io.reactivex.Observable.subscribe(Observable.java:12267)        at io.reactivex.internal.operators.observable.ObservableDoOnEach.subscribeActual(ObservableDoOnEach.java:42)        at io.reactivex.Observable.subscribe(Observable.java:12267)        at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:32)        at io.reactivex.Observable.subscribe(Observable.java:12267)        at io.reactivex.internal.operators.observable.ObservableFlatMapSingle.subscribeActual(ObservableFlatMapSingle.java:48)        at io.reactivex.Observable.subscribe(Observable.java:12267)有人可以帮我解决这个问题吗?我需要在后台线程上运行网络调用,但在主线程上接收结果。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

您正在使用事件.subscribeOn(Schedulers.io())源RxView.clicks(this.btnNext)。这意味着RxView将在 IO 线程上订阅,但这是不允许的。您应该Single<String>通过 为您的源配置调度程序flatMapSingle(key -> new Api(key).id().subscribeOn(Schedulers.io()))。所以完整的代码应该是:


RxView.clicks(this.btnNext)

  .map(none -> this.editTextKey.getText().toString())

  .filter(x -> !x.isEmpty())

  .flatMapSingle(key -> new Api(key).id().subscribeOn(Schedulers.io()))

  .observeOn(AndroidSchedulers.mainThread())

  .subscribe(this::showId, err -> {

    Log.e(this.getClass().getSimpleName(), "Login error", err);

  })

现在网络操作将在IO线程上进行,查看订阅在主线程上。


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信