【发布时间】:2017-12-22 23:58:57
【问题描述】:
我制作了一个带有地理标记的社交报告应用程序来报告 Android 上的破损街道。它需要位置数据才能发布报告。从照片的 Exif、Gps 传感器或从 MapsPickerActivity 手动设置。
我设法使用RxLocation 库发出位置请求。当应用程序仍在从 Gps 获取位置时,将启用一个按钮。由于从 Gps 获取位置数据可能需要一段时间,我让用户同时手动设置位置。如果用户按下按钮,我想停止 getGpsLocationObservable。如果我不停止 getGpsLocationObservable,恐怕该进程仍会运行并在设置自定义位置后出现。那会很烦人。 我怎样才能做到这一点?
这里是简化代码的sn-ps
主要一次性用品:
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);
});
}
【问题讨论】:
-
你有代码吗?
-
代码又长又丑。我将整个过程链接在一个可观察的对象上,从图库/相机获取图片(压缩、旋转、保存到文件提供程序)后处理图片,然后将其转换为 exif 阅读器以获取位置数据。如果失败/未找到,则继续将 observable 平面映射到 getLocationWithGps。我在 exifreader complete/error 上启用了选择自定义位置按钮。不过好吧,我会尝试嵌入代码。
-
查看
takeUntil并使用按钮的点击事件作为它的来源。 -
@akarnokd 是的,这正是我想要的。我实际上对 RxJava 很陌生(大约 2 周前才开始学习它),我什至不费心阅读每个操作员文档。在第一周学习 Rx 编程的基本概念时完全不知所措。谢谢!
标签: java android rx-java rx-java2 rx-android