RXJava остановить, наблюдаемую внутри плоской карты

Я сделал приложение социального отчета с геотегами, чтобы сообщать о разбитых улицах на 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);
        });
}

person Tadho    schedule 22.12.2017    source источник
comment
У вас есть код?   -  person Hans Wurst    schedule 22.12.2017
comment
Код очень длинный и некрасивый. Я связал весь процесс с наблюдаемой обработкой изображения после его извлечения из галереи/камеры (сжатие, поворот, сохранение в поставщике файлов), а затем преобразовал его в средство чтения exif, чтобы получить данные о местоположении. Если не удалось/не найдено, перейдите к отображению наблюдаемого объекта в getLocationWithGps. Я включаю кнопку выбора пользовательского местоположения на exifreader complete/error . Но ладно, попробую вставить код.   -  person Tadho    schedule 22.12.2017
comment
Взгляните на takeUntil и используйте событие нажатия кнопки в качестве источника для него.   -  person akarnokd    schedule 22.12.2017
comment
@akarnokd да, это именно то, что я ищу. На самом деле я новичок в RxJava (только начал изучать его около 2 недель назад), я даже не утруждаю себя чтением документации каждого оператора. Будьте полностью ошеломлены изучением базовой концепции программирования Rx в первую неделю. Спасибо!   -  person Tadho    schedule 22.12.2017


Ответы (1)


Я предполагаю, что это отличный вариант использования оператора .amb(), который принимает вывод только того наблюдаемого объекта, который начал излучать первым, и игнорирует все остальные. См. http://reactivex.io/RxJava/javadoc/rx/Observable.html#amb-rx.Observable-rx.Observable-

person Maxim Volgin    schedule 22.12.2017
comment
В итоге я создал PublisherSubject, который отправлял истинное значение при каждом нажатии кнопки. Затем поместите его в оператор takeUntil для getGpsLocationObservable. Как я вижу, он лучше подходит или, скорее, проще для моего текущего варианта использования. Спасибо, в любом случае - person Tadho; 27.12.2017