EditText 自動搜尋本地資料庫(大資料量)卡頓解決方案
阿新 • • 發佈:2019-01-25
假設本地存了很多資料,按關鍵字搜尋,而且要求自動搜尋,沒有搜尋按鈕,輸入法上也沒有,就要求這種體驗,當你輸入一個字元的時候,EditText的addTextChangedListener其實就開始監聽了,比如你想搜尋abc ,其實查詢了三次資料庫,先搜a,再ab,然後才是abc。這當然不合理,其實假設從網路拉取資料,這樣也是不合理的。解決方案是加入Handler 來處理。程式碼如下:
每次先remove訊息,在延遲400ms傳送訊息,這樣就可以大大優化了,連續輸入造成的多次取資料庫。然後在handler收訊息的地方處理資料庫或者網路請求的操作。代買如下:searchInput.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable edit) { searchInput.requestFocus(); handler.removeMessages(TRIGGER_SERACH); if (!TextUtils.isEmpty(edit.toString()) { handler.sendEmptyMessageDelayed(TRIGGER_SERACH, 400); } });
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub // super.handleMessage(msg); switch (msg.what) { case TRIGGER_SERACH: getSearchData(); break; } } };