RxJava-等待异步任务,然后调用Api

时间:2019-03-25 21:41:58

标签: java android kotlin rx-java rx-java2

尝试获取lastLocation,完成后调用api。但是无论如何,一旦获得位置,我的api调用便始终在mainThread中运行,所以我遇到了异常:

android.io.NetworkOnMainThreadException

这是我的位置观察器:

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

我已经设置了subscribeOn,所以它不应该在mainThread上,但是看起来好像丢失了一些东西。

发现,如果我使用Single.just("One").flatMap{ ... }之类的东西可以正常工作,并且可以在非主线程上执行。

getLocation函数有关吗?

1 个答案:

答案 0 :(得分:1)

subscribeOnobserveOnsubscribe的顺序和转换很重要。显然,需要进行转换,在这种情况下,flatMap 之后observeOn指定观察者线程,以确保代码在正确的线程中执行。 / p>