Вот подход, который не требует дополнительного поля для отслеживания чего-либо, но это не обязательно делает его лучше.
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)
}