【问题标题】:What should I do if I want to add a condition to Android Debounce?如果我想给 Android Debounce 添加条件怎么办?
【发布时间】:2020-10-19 08:14:10
【问题描述】:

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

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

【问题讨论】:

    标签: android kotlin rx-java2


    【解决方案1】:

    这里缺少一些信息,比如返回 queryTextChangeEvents() 方法,所以我假设返回一些 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 }
    

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 2014-03-02
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多