在我的应用程序中,我需要等待用户位置然后执行改造(当收到位置时)。
我有可观察的工作
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更好的方法?
谢谢
答案 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(...)