RxJava 2-如何仅对首次单击事件执行操作,然后在事件发生后重新启动?

时间:2018-09-21 05:36:24

标签: java android kotlin rx-java rx-java2

我有一个按钮。如果用户多次按下它,我希望它仅在收到第一次点击时才运行一种方法。该方法完成运行并完成后,我想再次监听按钮的单击,仅在收到第一次单击时才执行操作...忽略其他单击(继续重复此操作)。如何使用RxJava 2做到这一点?我不想沿着firstElement()的方式使用东西,因为它会使按钮在第一次单击后不可用。谢谢!

2 个答案:

答案 0 :(得分:0)

实际上,这不是最好的解决方案,但它可以提供帮助-您可以保存操作状态。像这样:

var isActionDone = true

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

答案 1 :(得分:0)

这是一种不需要辅助字段来跟踪任何内容的方法,但这不一定会使它变得更好。

clicks()来自Jake Wharton的RxBinding library。您可以根据需要获得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)
}