Получение исключения NetworkOnMainThread с помощью RxKotlin

Я пытаюсь сделать сетевой запрос, используя RxKotlin, но продолжаю получать NetworkOnMainThreadException Я подписываюсь на основной поток, поэтому я не уверен, почему он не снимает его с потока пользовательского интерфейса.

Здесь я подписываюсь на Наблюдаемый

 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() } ) } 

Здесь я создаю свой наблюдаемый

 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) } } } 

Кажется, вы путаете subscribeOn и observeOn методы.

subscribeOn указывает, что планируемый наблюдатель будет создан и будет работать. (Вы указываете его один раз, позиция не имеет значения).

observeOn изменяет планировщик для каждого действия, которое вы 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 -> { });