等待位置,然后使用rxjava执行retrofit调用

时间:2016-04-11 18:31:27

标签: android retrofit rx-java rx-android

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

我有可观察的工作

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

但是现在我需要通过改装调用调用第二个observable,有没有比在第一个onNext()中嵌套第二个observable更好的方法?

谢谢

1 个答案:

答案 0 :(得分:4)

是的,您可以使用flatmap运算符:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> retrofitApi.getData(location))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)

订阅现在将获得改装调用的结果

如果您需要返回改造结果和位置,那么您可以使用zip运算符:

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

其中ResponseLocation只是一个获取位置和改进结果的类。然后,订阅将获得ResponseLocation作为其参数。

修改

要在调用Retrofit之前使用该位置,只需展开lambda:

mlocationService.getLocation()
        .timeout(LOCATION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.newThread())
        .flatmap(location -> {
            updateMap(location);
            return retrofitApi.getData(location);
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)