Android使用TimerTask延迟访问数据

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();
                }
            }
        }
    };
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值