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 }
我实现了一项功能,使用 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 }