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,然后调用改装。在您的示例中,应用程序等待两个任务完成,然后交付结果。啊,好的。在这种情况下,您可以在调用改装之前使用平面图中的位置。我会再次更新