Android 使用RxKotlin获取NetworkOnMainThreadException

Android 使用RxKotlin获取NetworkOnMainThreadException,android,kotlin,rx-java,rx-kotlin,Android,Kotlin,Rx Java,Rx Kotlin,我正在尝试使用RxKotlin发出网络请求,但不断得到一个NetworkOnMainThreadException我在主线程上订阅,因此我不确定为什么它没有将其从UI线程中移除 这里是我同意可观察的地方 weatherInteractor.getWeather(lat, lng) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())

我正在尝试使用RxKotlin发出网络请求,但不断得到一个
NetworkOnMainThreadException
我在主线程上订阅,因此我不确定为什么它没有将其从UI线程中移除

这里是我同意可观察的地方

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)
            }
        }
    }
这里是我创建可观察对象的地方

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)
            }
        }
    }
fun getWeather(纬度:双倍,液化天然气:双倍):可观测{
val URL=“”
val client=OkHttpClient()
val request=request.Builder()
.url(url)
.build()
返回可观察的。创建{em->
试一试{
val response=client.newCall(request.execute())
em.onNext(回复)
em.onComplete()
}捕获(错误:IOException){
err.printStackTrace()
em.onError(err)
}
}
}

您似乎混淆了
subscribeOn
observeOn
方法

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

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

            });

我不确定我是否看到了区别。从您的代码:
weatherinteractitor.getWeather(lat,lng)、observeOn(Schedulers.io())、subscribeOn(AndroidSchedulers.mainThread())
您在
AndroidSchedulers.mainThread()和
中进行请求。subscribe()
Observer
)运行在
Schedulers.io()上。我同时切换了它们,
subscribeOn(Schedulers.io())
,和
observeOn(AndroidSchedulers.mainThread())
,但它给出了相同的错误刚刚测试过以下代码完全按照预期工作(给定android.permission.internetin AndroidManifest.xml中的android.permission.INTERNET)如果需要,我可以上传整个测试项目。如果你投反对票,请发表评论