RxJava 2 - Как вы выполняете действие только для события первого щелчка, а затем перезапускаетесь после события? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть кнопка.Если пользователь нажимает на него несколько раз, я хочу, чтобы он запускал метод только тогда, когда он получил первый щелчок.После того как метод будет запущен и завершен, я хочу снова прослушивать нажатия кнопок и выполнять действие только при получении первого щелчка ... игнорировать остальные щелчки (продолжайте повторять это).Как мне сделать это с RxJava 2?Я не хочу использовать вещи в соответствии с firstElement (), потому что это сделает кнопку непригодной для использования после первого щелчка.Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вот подход, который не требует дополнительного поля для отслеживания чего-либо, но это не обязательно делает его лучше.

clicks() из библиотеки RxBinding Джейка Уортона .Вы можете получить Observable так, как вам нравится.

button.clicks()
    // not strictly necessary, since we disable the button
    .filter { button.isEnabled }
    .doOnNext { button.isEnabled = false }
    .observeOn(Schedulers.computation()) // or io() or whatever
    .flatMap { doThing() }
    .observeOn(AndroidSchedulers.mainThread())
    // `each` instead of `next` so this also consumes errors
    .doOnEach { button.isEnabled = true }
    .subscribe()

private fun doThing(): Observable<Int> {
    // simulate long-running op
    Thread.sleep(2000)
    // return any value; doesn't matter
    return Observable.just(0)
}
0 голосов
/ 21 сентября 2018

На самом деле, не лучшее решение, но оно может помочь - вы можете сохранить состояние своих действий.Как то так:

var isActionDone = true

buttonObservable
.filter { isActionDone }
.flatMap {
   isActionDone = false
   youActionCompletable
}
.subscribe { isActionDone = true }
...