android - 如果我想给 Android Debounce 添加条件怎么办?
问题描述
我实现了一个功能,可以每秒自动搜索使用 Debounce 在 SearchView 中输入的字符串。单击提交按钮绕过自动搜索功能并执行搜索。问题中的代码工作正常,但我想重构它。你能给我一些建议吗??
searchView.queryTextChangeEvents()
.debounce {
if (it.isSubmitted) {
Observable.just(it)
} else {
Observable.just(it).delay(1000L, TimeUnit.MILLISECONDS)
}
}
.subscribe { // Search }
解决方案
这里缺少一些信息,比如什么返回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 }
推荐阅读
- cryptography - 矩阵哈希值的计算
- css - IE 和 Edge 忽略 svg 的绝对位置
- api - 倒数函数的cuda“舍入模式”
- alm - 如何在 ALM 12.53 中读取链接实体
- typo3 - TYPO3:通过 Typoscript 或 ViewHelper 渲染插件并更改设置
- html - 保存 HTML 页面的 DOM 树
- c - 在while循环中进行套接字和连接调用
- azure-active-directory - 设置允许 MSA 登录的 Azure 应用程序的当前有效且正确的方法是什么?
- javascript - fullpage.js silentMoveTo 似乎不起作用?
- spring-boot - Mybatis - 无效的绑定语句(未找到)