Я пытаюсь сделать сетевой запрос, используя 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 -> { });