想必即时搜索大家都做过,一般都监听EditText字符串改变或者SearchView来实现。但有时候,我们不想让它
输入一个字符就请求一次,删除一个字符也请求一次,那样太频繁了那有什么好方法可以实现让它输入后过一秒(或
者自定义时间)再搜索吗?下面这个工具类可以帮到你。
public class RealTimeSearchUtil {
private static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(10);
private static RealTimeSearchUtilLisetener mRealTimeSearchUtilLisetener;
private static MyHandler handler = new MyHandler();
/**
* 实时搜索数据,通过RealTimeSearchUtilLisetener接口操作
* @param newText 搜索的字符串
* @param time 过多久搜索
* @param realTimeSearchUtilLisetener
*/
public static void sendRealTimeSearchMessage(String newText,int time, RealTimeSearchUtilLisetener realTimeSearchUtilLisetener){
showSearchTip(newText,time);
mRealTimeSearchUtilLisetener = realTimeSearchUtilLisetener;
}
public static void showSearchTip(String newText,int time) {
schedule(new SearchTipThread(newText), time);
}
public static ScheduledFuture<?> schedule(Runnable command, long delayTimeMills) {
return scheduledExecutor.schedule(command, delayTimeMills, TimeUnit.MILLISECONDS);
}
private static class SearchTipThread implements Runnable {
String newText;
protected SearchTipThread(String newText) {
this.newText = newText;
}
@Override
public void run() {
// keep only one thread to load current search tip, you can get data from network here
boolean flag = newText != null && newText.length() > 0;
if (flag) {
handler.sendMessage(handler.obtainMessage(1));//不能在子线程中在开启一个子线程
}
}
}
private static class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
mRealTimeSearchUtilLisetener.handleUIMessage();
break;
}
}
}
public interface RealTimeSearchUtilLisetener{
/**
* 此方法在主线程中执行,可以发送网络请求数据
*/
void handleUIMessage();
}
}
如何使用?
etSearch.addTextChangedListener(textWatcher);
public TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(final CharSequence s, int start, int before, int count) {
RealTimeSearchUtil.sendRealTimeSearchMessage(s.toString(),500, new RealTimeSearchUtil.RealTimeSearchUtilLisetener() {
@Override
public void handleUIMessage() {
//发起请求
}
});
}
@Override
public void afterTextChanged(Editable s) {
}
};
欢迎Star,Thank You Github: https://github.com/LxzBUG/LimitedTimeSearchUtils