首页 > 解决方案 > 如果我想给 Android Debounce 添加条件怎么办?

问题描述

我实现了一个功能,可以每秒自动搜索使用 Debounce 在 SearchView 中输入的字符串。单击提交按钮绕过自动搜索功能并执行搜索。问题中的代码工作正常,但我想重构它。你能给我一些建议吗??

searchView.queryTextChangeEvents()
        .debounce {
            if (it.isSubmitted) {
                Observable.just(it)
            } else {
                Observable.just(it).delay(1000L, TimeUnit.MILLISECONDS)
            }
        }
        .subscribe { // Search }

标签: androidkotlinrx-java2

解决方案


这里缺少一些信息,比如什么返回queryTextChangeEvents()方法,所以我假设返回一些Observable<String>。在这种情况下,在每个文本输入上,观察者都会被一些关键字触发。

如果我理解,您希望每 1 秒执行一次自动搜索,并在按下search按钮时强制搜索。所以在这种情况下,你应该订阅两个观察者:

  • 搜索按钮点击监听器
  • 每 1 秒触发一次

并且queryTextChangeEvents()观察者是不必要的。

假设搜索按钮有 idsearchBtn并且搜索文本输入字段有 id searchView。使用 RxBinding 库,您可以通过点击订阅RxView.clicks(searchBtn).

最后,您应该合并这两个观察者Observable.merge()并防止使用去抖动运算符进行过多搜索。

例如:

val timedSearchTrigger = Observable.interval(1,TimeUnit.SECONDS)
val buttonClickTrigger = RxView.clicks(searchBtn)

Observable.merge(timedSearchTrigger,buttonClickTrigger)
        .debounce(200,TimeUnit.MILLISECONDS)
        .flatMap {api.search(searchView.text)}
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { // search results }

推荐阅读