【问题标题】:RXJava stop observable inside flatmapRXJava 在平面图中停止可观察
【发布时间】: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


【解决方案1】:

我想这是 .amb() 运算符的一个很好的用例,它只获取最先开始发射的可观察对象的输出,而忽略所有其他对象。见http://reactivex.io/RxJava/javadoc/rx/Observable.html#amb-rx.Observable-rx.Observable-

【讨论】:

  • 我最终创建了一个 PublisherSubject,只要按下按钮就会发送真值。然后将其放入 getGpsLocationObservable 上的 takeUntil 运算符中。我认为它更适合我当前的用例,或者更简单。还是谢谢
猜你喜欢
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多