最近项目中,增加了搜索功能,当用户输入内容时自动请求网络处理数据;我们首先想到的是对EditText设置监听addTextChangedListener,然后在afterTextChanged方法中进行处理。
这样能实现功能,但是当用户输入abcd等单个字符内容时,就会执行好多次afterTextChanged方法,请求多次网络。如果说,一般输入的都是中文,比如输入“中央音乐学院”查找时,用户是一次性输入的,这样就不会请求多次网络,但是这时当用户想只查找“中央”两字时,把“音乐学院”四字删除,就会导致请求四次网络,虽然结果也是最后一次查找的结果,然而前三次的网络请求不是多余了吗,而且如果这四次网络请求出现了延迟等问题,可能导致最后显示的结果不是最后请求的数据。记录一下本次代码。
@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方法中得到当前的时间并发送延迟消息
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;
}
}};
接收到消息后,判断当前的时间和最后一次输入字符的时间间隔,如果大于1000毫秒在处理数据,这时就是用户输入最后一个字符的请求。如果非要说用户输入的很慢,超过了1000毫秒呢,这个不做辩论,自己处理就好。