我制作了一个地理标记的社交报告应用程序来报告Android上破碎的街道。它需要位置数据来发布报告。从照片的Exif,Gps传感器或从MapsPickerActivity手动设置。
我设法使用RxLocation库发出了位置请求。当应用仍然从Gps获取位置时,有一个按钮正在启用。由于从Gps获取位置数据可能需要一段时间,因此我让用户只需手动设置位置。如果用户按下按钮,我想停止getGpsLocationObservable。如果我没有停止getGpsLocationObservable,我担心在设置自定义位置后进程仍然会运行。那会很烦人。 我怎么能做到这一点?
以下是简化代码的片段
主要一次性:
Disposable myDisposable = imageProcessingObservable()
.compose(getExifLocationTransformer()) //custom location button enabled here
.filter(isLocationSet -> isLocationSet)
.flatmap(x->getGpsLocationObservable());
RxLocation getGpsLocationObservable:
private Observable<String> getGpsLocationObservable(){
locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setNumUpdates(1)
.setInterval(3000);
rxLocation = new RxLocation(PostActivity.this);
rxLocation.setDefaultTimeout(10, TimeUnit.SECONDS);
return rxLocation.settings()
.checkAndHandleResolution(locationRequest)
.flatMapObservable(isActivated->{
if (isActivated) {
return locationSettingsActivatedObservable();
}
else locationNotFoundObservable();
});
}
@SuppressLint("MissingPermission")
private Observable<String> locationSettingsActivatedObservable(){
return rxLocation.location().updates(locationRequest)
.map(location -> {
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
String street = getStreetName(latLng);
return street;
})
.doOnNext(street->{
updateUI(street);
});
}
答案 0 :(得分:0)
我猜这是 .amb()运算符的一个很好的用例,它只接受开始先发射并忽略所有其他的observable的输出。见http://reactivex.io/RxJava/javadoc/rx/Observable.html#amb-rx.Observable-rx.Observable-