EditText搜索優化

搜索頁面是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)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容