我是新來的。我正在嘗試使用適用于 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條經驗 獲得超14個贊
您正在使用事件.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線程上進行,查看訂閱在主線程上。
添加回答
舉報
0/150
提交
取消