首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJava -等待异步任务,然后调用Api

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

Stack Overflow用户
提问于 2019-03-26 05:41:58
回答 1查看 765关注 0票数 1

尝试获取lastLocation并在完成后调用api。但不知何故,一旦获得位置,我的应用程序接口调用总是在mainThread中运行,所以我得到了异常:

代码语言:javascript
复制
android.io.NetworkOnMainThreadException

这里的是我的位置观察者:

代码语言:javascript
复制
fun getLocation(): Single<Location> {
        return Single.create<Location> { subscriber ->
            fusedLocationClient.lastLocation.addOnSuccessListener {
                if (it != null) {
                    subscriber.onSuccess(it)
                } else {
                    subscriber.onError(Exception("No location"))
                }
            }
        }
    }

执行一些转换的代码

代码语言:javascript
复制
val locationObserver = getLocation()
observables.add(locationObserver.flatMap { _ -> sendDataToServer(data)})

观察者

代码语言:javascript
复制
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函数有什么关系吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-26 06:23:57

subscribeOnobserveOnsubscribe和转换的顺序很重要。显然,它需要进行转换,在本例中,是在使用observeOn指定观察者线程之后的flatMap,以确保代码在正确的线程中执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55346851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档