我正在尝试使用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)
}
}
}
答案 0 :(得分:1)
您似乎混淆了subscribeOn
和observeOn
方法。
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 -> {
});