-2

我正在尝试使用 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)
            }
        }
    }
4

1 回答 1

1

看来你混淆了subscribeOn方法observeOn

subscribeOn指定将在其上创建和操作的调度程序 observable。(您指定一次,位置无关紧要)。

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 -> {

            });
于 2017-09-28T02:14:49.920 回答