RXJava在flatmap

时间:2017-12-22 02:10:02

标签: java android rx-java rx-java2 rx-android

我制作了一个地理标记的社交报告应用程序来报告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);
        });
}

1 个答案:

答案 0 :(得分:0)

我猜这是 .amb()运算符的一个很好的用例,它只接受开始先发射并忽略所有其他的observable的输出。见http://reactivex.io/RxJava/javadoc/rx/Observable.html#amb-rx.Observable-rx.Observable-