Android使用TimerTask延迟访问数据
这两天写一个搜索遇到一个延迟加载的问题。就是判断搜索框内容改变的时候就去访问数据库,初想很简单,但是每次用户一改变就去访问数据对数据库的访问过于频繁,就想判断文本框值改变时后750毫秒后如果文本框的值没有发生改变再去访问数据库。初想很简单,用Handle+TimerTask就可以简单实现。如下:
监听输入框文本的改变:
private TextWatcher searchEditChange() { return new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { searchResultListLv.setVisibility(View.GONE); if (s.toString().length() == 0) { clearSearch.setVisibility(View.INVISIBLE); searchListLv.setVisibility(View.GONE); brnSearch.setText("取消"); historyCache = mAcache.file(SEARCH_HISTORY); if (historyCache != null) { searchHistory.setVisibility(View.VISIBLE); handler.post(eChanged2); } } else { clearSearch.setVisibility(View.VISIBLE); searchListLv.setVisibility(View.VISIBLE); brnSearch.setText("搜索"); String str=searchEdit.getText().toString(); if(str.length()!=0&&!str.equals("")){ startTimer(); } } } }; }
自定义TimerTask获取输入框内容,并给Handler 发送消息
public class TimeString extends TimerTask{ @Override public void run() { Message msg = handler.obtainMessage(); msg.obj = searchEdit.getText().toString(); msg.what = 7; // 输入框搜索文本 cancel(); handler.sendMessage(msg); } }延迟750毫秒后访问
private void startTimer(){ timer = new Timer(); TimerTask temp=new TimeString(); timer.schedule(temp,750); }使用handler访问数据[声明和实例化Handle的步骤就不贴出来了]
@Override public boolean handleMessage(Message msg) { switch (msg.what) { case 7: input=msg.obj.toString(); getSearchDate();//我自己访问数据的方法,这里就不贴出来了 break; default: break; } return false; }完成这些后,发现并没有达到我预期想要的效果,还是访问了数据库多次,只是推迟了750毫秒。后来想到能不能在这个Timer计时的时候如果值再发生该变就销毁这个计时器,重新new一个计时器。于是在启动Timer之前判断了这个Timer是否为空,如果不为空就销毁这个Timer,贴出图1改过后的代码。
/** * 搜索框改变监听 * * @return */ private TextWatcher searchEditChange() { return new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { searchResultListLv.setVisibility(View.GONE); if (s.toString().length() == 0) { clearSearch.setVisibility(View.INVISIBLE); searchListLv.setVisibility(View.GONE); brnSearch.setText("取消"); historyCache = mAcache.file(SEARCH_HISTORY); if (historyCache != null) { searchHistory.setVisibility(View.VISIBLE); handler.post(eChanged2); } } else { clearSearch.setVisibility(View.VISIBLE); searchListLv.setVisibility(View.VISIBLE); brnSearch.setText("搜索"); String str=searchEdit.getText().toString(); if(str.length()!=0&&!str.equals("")){ if(timer!=null){ timer.cancel(); } startTimer(); // input = searchEdit.getText().toString(); } } } }; }