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  LiveData.toReactiveStream(
        observerScheduler: Scheduler = AndroidSchedulers.mainThread()
): Flowable = Flowable
        .create({ emitter: FlowableEmitter ->
            val observer = Observer { data ->
                data?.let {
                    emitter.onNext(it)
                }
            }
            observeForever(observer)

            emitter.setCancellable {
                object : MainThreadDisposable() {
                    override fun onDispose() {
                        removeObserver(observer)
                    }
                }
            }
        }, BackpressureStrategy.LATEST)
        .subscribeOn(AndroidSchedulers.mainThread())
        .observeOn(observerScheduler)

你可能感兴趣的:(EditText搜索优化)