EditText搜索优化

作者: Raven | 来源:发表于2021-02-25 22:49 被阅读0次

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

    相关文章

      网友评论

        本文标题:EditText搜索优化

        本文链接:https://www.haomeiwen.com/subject/jwrpfltx.html