#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));
}