搜索頁面是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)