Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava-等待异步任务,然后调用Api_Java_Android_Kotlin_Rx Java_Rx Java2 - Fatal编程技术网

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()
        })