使用 RxKotlin 获取 NetworkOnMainThreadException

Getting NetworkOnMainThreadException with RxKotlin

我正在尝试使用 RxKotlin 发出网络请求,但一直收到 NetworkOnMainThreadException 我正在主线程上订阅,所以我不确定为什么它没有将其从 UI线程。

这是我订阅 Observable 的地方

weatherInteractor.getWeather(lat, lng)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        {response ->
                            try {
                                val jsonData = response.body().string()
                                val currentWeather = getCurrentWeatherData(jsonData)
                                view!!.displayCurrentWeather(currentWeather)
                            } catch (e: JSONException) {
                                Log.d("Present JSON Exception", e.message)
                            } catch (e: IOException) {
                                Log.d("Present IO Exception", e.message)
                            }
                        },
                        {
                            error ->
                            error.printStackTrace()
                        }
                )
    }

这是我创建 Observable 的地方

fun getWeather(lat: Double, lng: Double): Observable<Response> {
        val URL = ""
        val client = OkHttpClient()
        val request = Request.Builder()
                .url(URL)
                .build()

        return Observable.create { em ->
            try {
                val response = client.newCall(request).execute()
                em.onNext(response)
                em.onComplete()
            } catch (err: IOException) {
                err.printStackTrace()
                em.onError(err)
            }
        }
    }

您似乎混淆了 subscribeOnobserveOn 方法。

subscribeOn 指定将在其上创建和运行的可观察调度程序。 (你指定一次,位置无关紧要)。

observeOn 为您在其后键入的每个操作更改调度程序。 您可以多次使用它,每组动作都将在指定的调度程序上执行。

这是一个例子:

Observable
            .just("test")
            .subscribeOn(Schedulers.io())
            .map(s -> { //this and all Observable code is executed on Schedulers.io()

                return s;
            })
            .observeOn(Schedulers.computation())
            .map(s -> { // executed on Schedulers.computation()

                return s;
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(s -> { // executed on Android main thread

            }, throwable -> {

            });