場景: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); } });