使用 RxKotlin 获取 NetworkOnMainThreadException
Getting NetworkOnMainThreadException with RxKotlin
我正在尝试使用 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)
}
}
}
您似乎混淆了 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 -> {
});
我正在尝试使用 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)
}
}
}
您似乎混淆了 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 -> {
});