AndroidDebounce要加条件怎么办?

What should I do if I want to add a condition to Android Debounce?

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

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

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

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

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

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

假设搜索按钮的 ID 为 searchBtn,搜索文本输入字段的 ID 为 searchView。 使用 RxBinding library 您可以订阅点击 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 }