搜索页面是App中很常见的功能。通过用户输入的信息,调用接口获取搜索结果。为了避免请求过于频繁,需要过滤掉用户输入过程中的请求,等用户可能已经输入结束时,再进行请求。
技术栈
- Rxjava
- LiveData
实现
fun getSearchCompletion() {
//LiveData转换Flowable
searchValue.toReactiveStream()
.filter {
if (it.isBlank()) {
//为空时,清空搜索结果
}
true
}
.debounce {
//连续的输入,时间间隔小于300ms,将不会触发搜索操作
Flowable.timer(timeOut ?: 300, TimeUnit.MILLISECONDS)
}
.filter {
it.isNotBlank()
}
.distinctUntilChanged()
.switchMap {
//调用接口进行搜索
mRepository.getSearchCompletion(it).toFlowable(BackpressureStrategy.LATEST)
}
.doOnNext {
//处理搜索接口,并可根据接口返回,控制间隔时间
if (timeOut != it.call_interval) {
timeOut = it.call_interval
}
}
.autoDisposable(this)
.subscribe()
}
附上LiveData转换Flowable代码
fun <T> LiveData<T>.toReactiveStream(
observerScheduler: Scheduler = AndroidSchedulers.mainThread()
): Flowable<T> = Flowable
.create({ emitter: FlowableEmitter<T> ->
val observer = Observer<T> { data ->
data?.let {
emitter.onNext(it)
}
}
observeForever(observer)
emitter.setCancellable {
object : MainThreadDisposable() {
override fun onDispose() {
removeObserver(observer)
}
}
}
}, BackpressureStrategy.LATEST)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(observerScheduler)
网友评论