转载请注明出处,谢谢:http://blog.youkuaiyun.com/harryweasley/article/details/50395209
假如你要做这样的一个功能,通过在编辑框输入一些字符进行搜索,输入完成后,再显示搜索结果,在输入的过程中,并不想一直通知服务器来获取数据。
假设这样的一个场景,你想搜索“1024”这个游戏,那么你肯定不想当输入1 的时候,就和服务器进行一次沟通吧,如果这样对服务器压力太大了,你肯定希望的是当输完1024后,再和服务器进行交互,显示出数据。
本博客,就是监听editText输入完成后,然后再和服务器进行交互,获取数据,大大减小服务器的压力。
以下,就是具体的实现代码了:
private Handler handler = new Handler();
/**
* 延迟线程,看是否还有下一个字符输入
*/
private Runnable delayRun = new Runnable() {
@Override
public void run() {
//在这里调用服务器的接口,获取数据
getSearchResult(editString, "all", 1, "true");
}
};
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
if(delayRun!=null){
//每次editText有变化的时候,则移除上次发出的延迟线程
handler.removeCallbacks(delayRun);
}
editString = s.toString();
//延迟800ms,如果不再输入字符,则执行该线程的run方法
handler.postDelayed(delayRun, 800);
}
});
上面,主要用到了两点技术
1.
handler.postDelayed(delayRun, 800) 延迟800ms执行线程
2.
handler.removeCallbacks(delayRun); 移除当前MessageQueue里面的待执行的线程