RxJava-等待异步任务,然后调用Api
尝试获取RxJava-等待异步任务,然后调用Api,java,android,kotlin,rx-java,rx-java2,Java,Android,Kotlin,Rx Java,Rx Java2,尝试获取lastLocation,完成后调用api。但不知何故,一旦获得了位置,我的api调用总是在mainThread中运行,所以我遇到了异常: android.io.NetworkOnMainThreadException 这是我的位置观察员: 观察者 我已经设置了subscribebeon,所以它不应该在main线程上,但看起来好像遗漏了什么 发现如果我将使用类似于Single.just(“One”).flatMap{…}的东西,它将很好地工作,并将在非主线程上执行 是否与getLoca
lastLocation
,完成后调用api。但不知何故,一旦获得了位置,我的api调用总是在mainThread
中运行,所以我遇到了异常:
android.io.NetworkOnMainThreadException
这是我的位置观察员:
观察者
我已经设置了subscribebeon
,所以它不应该在main线程上,但看起来好像遗漏了什么
发现如果我将使用类似于Single.just(“One”).flatMap{…}
的东西,它将很好地工作,并将在非主线程上执行
是否与getLocation
函数有关?订阅的顺序、观察的顺序、订阅的顺序以及转换都很重要。显然,需要进行转换,在本例中,flatMap
在使用observeOn
指定观测者线程后,确保代码在正确的线程中执行。在subscribe块后,它不再可见,因此您不能这样做。只有在订阅呼叫之前才适用哦,糟糕,如果您将subscribebeon
和observeeon
的顺序切换,会怎么样?我以前也遇到过类似的问题,改变这些订单就是解决问题的方法。哦,该死,你给我指明了正确的方向。请在.flatMap{}
之前修改您的答案以使用observeOn(Schedulers.io())
很高兴我编辑了答案,请确保这是您的意思。
fun getLocation(): Single<Location> {
return Single.create<Location> { subscriber ->
fusedLocationClient.lastLocation.addOnSuccessListener {
if (it != null) {
subscriber.onSuccess(it)
} else {
subscriber.onError(Exception("No location"))
}
}
}
}
val locationObserver = getLocation()
observables.add(locationObserver.flatMap { _ -> sendDataToServer(data)})
Single.zip(observables) { args1 -> args1 }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe({
Timber.i("Success")
}, {
Timber.i("Error %s", observables.size, it.localizedMessage)
it.printStackTrace()
})