【问题标题】:Prevent Rapid Clicks with pure RxJava Implementation使用纯 RxJava 实现防止快速点击
【发布时间】:2020-03-09 11:13:58
【问题描述】:

我正在尝试通过使用throttleLast 的普通/纯RxJava 来防止快速点击。下面的代码执行得很好,但是blockingSubscribe 代码块永远不会被调用。我错过了什么吗?

我不是在寻找有关 JakeWharton/RxBinding 的任何建议。我只使用 RxJava

代码:

fun previousDateOnClick(view: View) {
    val time = System.currentTimeMillis()
    Timber.d("previousButtonClick time=%s", time)
    Observable.just(time)
            .throttleLast(500, TimeUnit.MILLISECONDS)
            .blockingSubscribe {
                Timber.d("blockingSubscribe throttleLast time=%s", time)
            }
}

日志输出:

2020-03-09 16:29:11.367 D: previousButtonClick time=1583751551367
2020-03-09 16:29:11.535 D: previousButtonClick time=1583751551535
2020-03-09 16:29:11.705 D: previousButtonClick time=1583751551704
2020-03-09 16:29:11.858 D: previousButtonClick time=1583751551857
2020-03-09 16:29:12.009 D: previousButtonClick time=1583751552009
2020-03-09 16:29:12.169 D: previousButtonClick time=1583751552169
2020-03-09 16:29:12.321 D: previousButtonClick time=1583751552320
2020-03-09 16:29:12.475 D: previousButtonClick time=1583751552474
2020-03-09 16:29:12.634 D: previousButtonClick time=1583751552633
2020-03-09 16:29:12.794 D: previousButtonClick time=1583751552793
2020-03-09 16:29:12.954 D: previousButtonClick time=1583751552953
2020-03-09 16:29:13.114 D: previousButtonClick time=1583751553114
2020-03-09 16:29:13.977 D: previousButtonClick time=1583751553976
2020-03-09 16:29:14.221 D: previousButtonClick time=1583751554220
2020-03-09 16:29:14.415 D: previousButtonClick time=1583751554414
2020-03-09 16:29:14.610 D: previousButtonClick time=1583751554609
2020-03-09 16:29:14.786 D: previousButtonClick time=1583751554786
2020-03-09 16:29:14.958 D: previousButtonClick time=1583751554957
2020-03-09 16:29:15.133 D: previousButtonClick time=1583751555132
2020-03-09 16:29:15.311 D: previousButtonClick time=1583751555310
2020-03-09 16:29:15.487 D: previousButtonClick time=1583751555486
2020-03-09 16:29:15.606 D: previousButtonClick time=1583751555605

这个帖子不是Preventing rapid clicks with RXJava 的重复,因为那里的问题不是关于使用pure/plain RxJava防止快速点击我可以在那里看到一些第三方建议。我在那里实现了任何公认的答案,但我仍然无法实现它,而且我对其他库不感兴趣。

【问题讨论】:

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


【解决方案1】:

如果 Observable 在时间间隔到期之前完成,throttleLast() 运算符不会发出最后一项。在您的情况下,您有一个 Observable 发出一个元素并立即完成。

如果您不介意立即接收第一个元素(随后是节流事件),您可以使用:

.throttleLatest( 500, TimeUnit.MILLISECONDS, true )

true 参数表明即使 Observable 在时间间隔结束之前完成,也应该发出最后一个元素。

如果你真的只对每个间隔结束时的最后一个元素感兴趣而对第一个不感兴趣,你可以使用 window() 运算符拆分 Observable 并获取每个时间窗口的最后一个元素:

.window( 500, TimeUnit.MILLISECONDS )
.flatMap( window -> window.lastElement().toObservable() )

但是.. 您提供的代码可能存在更大的问题,但在不知道您的意图的情况下很难判断。您可能不想为每次点击创建一个 Observable,而是使用 Observable.generate(...) 或使用 Subject 生成一个 Observable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多