Android 使用RxKotlin获取NetworkOnMainThreadException
我正在尝试使用RxKotlin发出网络请求,但不断得到一个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())
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)如果需要,我可以上传整个测试项目。如果你投反对票,请发表评论