最近項目中垂睬,增加了搜索功能,當(dāng)用戶輸入內(nèi)容時自動請求網(wǎng)絡(luò)處理數(shù)據(jù)抗悍;我們首先想到的是對EditText設(shè)置監(jiān)聽addTextChangedListener驹饺,然后在afterTextChanged方法中進行處理。
這樣能實現(xiàn)功能缴渊,但是當(dāng)用戶輸入abcd等單個字符內(nèi)容時赏壹,就會執(zhí)行好多次afterTextChanged方法,請求多次網(wǎng)絡(luò)衔沼。如果說蝌借,一般輸入的都是中文田柔,比如輸入“中央音樂學(xué)院”查找時,用戶是一次性輸入的骨望,這樣就不會請求多次網(wǎng)絡(luò),但是這時當(dāng)用戶想只查找“中央”兩字時欣舵,把“音樂學(xué)院”四字刪除擎鸠,就會導(dǎo)致請求四次網(wǎng)絡(luò),雖然結(jié)果也是最后一次查找的結(jié)果缘圈,然而前三次的網(wǎng)絡(luò)請求不是多余了嗎劣光,而且如果這四次網(wǎng)絡(luò)請求出現(xiàn)了延遲等問題,可能導(dǎo)致最后顯示的結(jié)果不是最后請求的數(shù)據(jù)糟把。記錄一下本次代碼绢涡。
@Override
public void afterTextChanged(Editable s) {
lastTime = System.currentTimeMillis();
Message message = Message.obtain();
message.obj = s.toString();
message.what = REQUESTDATA;
mHandler.sendMessageDelayed(message, 1000);
}
});
在afterTextChanged方法中得到當(dāng)前的時間并發(fā)送延遲消息
long lastTime = 0, currentTime = 0;
private final int REQUESTDATA = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case REQUESTDATA:
currentTime = System.currentTimeMillis();
String s = (String) msg.obj;
if (currentTime - lastTime >= 1000) {
LogPrint.logILsj(TAG, "大于--:");
} else {
LogPrint.logILsj(TAG, "小于");
}
break;
}
}};
接收到消息后,判斷當(dāng)前的時間和最后一次輸入字符的時間間隔遣疯,如果大于1000毫秒在處理數(shù)據(jù)雄可,這時就是用戶輸入最后一個字符的請求。如果非要說用戶輸入的很慢缠犀,超過了1000毫秒呢数苫,這個不做辯論,自己處理就好辨液。