Android 等待位置,然后使用rxjava执行改装调用

Android 等待位置,然后使用rxjava执行改装调用,android,retrofit,rx-java,rx-android,Android,Retrofit,Rx Java,Rx Android,在我的应用程序中,我需要等待用户位置,然后执行改装(当接收到位置时) 我有可观察到的工作状态 mlocationService.getLocation() .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread())

在我的应用程序中,我需要等待用户位置,然后执行改装(当接收到位置时)

我有可观察到的工作状态

mlocationService.getLocation()
            .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(location -> {
                Log.d(TAG, "COORDS: " + location.getLatitude() + ", " + location.getLongitude());
            }, e -> Log.e(TAG, e.getMessage()));
但是现在我需要用改型调用调用第二个可观察对象,有没有比将第二个可观察对象嵌套在第一个可观察对象的onNext()中更好的方法


谢谢

是的,您可以使用
flatmap
操作符:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> retrofitApi.getData(location))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> Observable.zip(
            retrofitApi.getData(location),
            Observable.just(location),
            (Func2<Response<Data>, Location, ResponseLocation>) (response, location) -> {
                return new ResponseLocation(response, location)
            }
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
订阅现在将获得改装呼叫的结果

如果需要同时返回改装结果和位置,则可以使用zip运算符:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> retrofitApi.getData(location))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> Observable.zip(
            retrofitApi.getData(location),
            Observable.just(location),
            (Func2<Response<Data>, Location, ResponseLocation>) (response, location) -> {
                return new ResponseLocation(response, location)
            }
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)

是,您可以使用
flatmap
操作符:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> retrofitApi.getData(location))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> Observable.zip(
            retrofitApi.getData(location),
            Observable.just(location),
            (Func2<Response<Data>, Location, ResponseLocation>) (response, location) -> {
                return new ResponseLocation(response, location)
            }
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
订阅现在将获得改装呼叫的结果

如果需要同时返回改装结果和位置,则可以使用zip运算符:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> retrofitApi.getData(location))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)
mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> Observable.zip(
            retrofitApi.getData(location),
            Observable.just(location),
            (Func2<Response<Data>, Location, ResponseLocation>) (response, location) -> {
                return new ResponseLocation(response, location)
            }
        ))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)

非常感谢你。这帮了我很大的忙。但是现在我怎么才能访问这个位置呢?我还需要用新位置更新地图。您可以使用zip操作符将位置与改装结果相结合。我会更新答案…谢谢你的回答,但我需要实现的是:尽快获取位置使用新位置更新UI,然后调用改装。在您的示例中,应用程序等待两个任务完成,然后交付结果。啊,好的。在这种情况下,您可以在调用改装之前使用平面图中的位置。我会再更新的,非常感谢你。这帮了我很大的忙。但是现在我怎么才能访问这个位置呢?我还需要用新位置更新地图。您可以使用zip操作符将位置与改装结果相结合。我会更新答案…谢谢你的回答,但我需要实现的是:尽快获取位置使用新位置更新UI,然后调用改装。在您的示例中,应用程序等待两个任务完成,然后交付结果。啊,好的。在这种情况下,您可以在调用改装之前使用平面图中的位置。我会再次更新