用戶搜索的聯想詞提示場景,避免頻繁請求

場景:java

用戶輸入搜索內容,進行輸入框的變化監聽,提供聯想詞。ide

需求:函數

避免頻繁請求,限制時間內獲取用戶最後想搜索的內容post

 

方案1:Handler實現 code

利用postDelayed方法和可撤銷的removeCallbacks方法實現ip

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (EDIT_OK == msg.what) {
                String newText = etSearch.getText().toString();
                if(!TextUtils.isEmpty(newText)) {
                    setInputtipsQuery(newText);
                }
            }
        }
    };

private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            mHandler.sendEmptyMessage(EDIT_OK);
        }
    };

etSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                mHandler.removeCallbacks(mRunnable);
                //600毫秒沒有輸入認爲輸入完畢
                mHandler.postDelayed(mRunnable, 600);
            }
        });

 

方案2:RxJava操做符進行限流rem

操做函數:debounce,500毫秒內採起最後一次的操做get

subject.debounce(500,      TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<CharSequence>() {

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable arg0) {

                    }

                    @Override
                    public void onNext(CharSequence charSequence) {
                        Log.d(TAG, "onNext" + charSequence.toString());
                        showSearchResult(charSequence);
                    }
                });
相關文章
相關標籤/搜索