使用RxKotlin获取NetworkOnMainThreadException

时间:2017-09-28 01:58:34

标签: android kotlin rx-java rx-kotlin

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

1 个答案:

答案 0 :(得分:1)

您似乎混淆了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 -> {

            });