Rx: Как отменить вызов?

#android #rx-java

#Android #rx-java

Вопрос:

Например, у нас есть вызов:

 getObsevable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(::onSuccess, ::onError))
  

Есть ли способ не запускать его, если условие истинно? Например:

 getObsevable()
.stop({ Calendar.getInstance().get(Calendar.MINUTE) % 2 == 0 })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(::onSuccess, ::onError))
  

В этом коде я имею в виду, что мы не должны запускать observable, если текущая минута нечетная. И запустите его, если текущая минута четная.

Комментарии:

1. Что-то мешает вам обернуть внутри if инструкции?

2. @JensV конечно, я могу. Но описанный способ более гибкий, как я думаю. Если у меня в приложении много одновременных вызовов, я могу управлять им из одного места.

3. @AntonisRadz Нет, это выглядит как «отменить, пока он не запустится». Мне нужно «не запускать его, если условие истинно».

Ответ №1:

Да, вы можете использовать filter для достижения этой цели. Итак, что происходит при использовании фильтра, если условие не выполняется, приведенный ниже поток не выполняется.

В вашем случае (или примере), если текущая минута нечетная, метод subscribe вызываться не будет. Однако, если он четный, поток будет работать именно так, как написано.

 getObservable()
    .filter({ Calendar.getInstance().get(Calendar.MINUTE) % 2 == 0 })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(::onSuccess, ::onError))
  

Вы можете прочитать об этом здесь ->http://reactivex.io/documentation/operators/filter.html

Ответ №2:

Назначьте его одноразовому и утилизируйте его перед запуском другого вызова или везде, где вам нужно его утилизировать

 Disposable disposable;


public void createDisposableWithMyObservable(){
    if(disposable != null) disposable.dispose();

    disposable = getObsevable()
                   .stop({ Calendar.getInstance().get(Calendar.MINUTE) % 2 == 0 })
                   .subscribeOn(Schedulers.io())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribe(::onSuccess, ::onError));
}