与RxKotlin获取NetworkOnMainThreadException

我试图使用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指定调度程序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 -> { });