1. 程式人生 > >EditText 自動搜尋本地資料庫(大資料量)卡頓解決方案

EditText 自動搜尋本地資料庫(大資料量)卡頓解決方案

假設本地存了很多資料,按關鍵字搜尋,而且要求自動搜尋,沒有搜尋按鈕,輸入法上也沒有,就要求這種體驗,當你輸入一個字元的時候,EditText的addTextChangedListener其實就開始監聽了,比如你想搜尋abc ,其實查詢了三次資料庫,先搜a,再ab,然後才是abc。這當然不合理,其實假設從網路拉取資料,這樣也是不合理的。解決方案是加入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);

				

			}
		});
每次先remove訊息,在延遲400ms傳送訊息,這樣就可以大大優化了,連續輸入造成的多次取資料庫。然後在handler收訊息的地方處理資料庫或者網路請求的操作。代買如下:
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;
		

			
			
			}
		}
	};