最近,项目需要修改一个bug,就是在edittext中监听用户输入,输入完了后就进行网络查询,我拿到手的项目的时候,之前的三个人不知道是谁写的,也都没有改,首先看下edittext的监听输入方法之一

 inputText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }
            @Override

            public void afterTextChanged(Editable s) {

            }

        });

他们的做法是在afterTextChanged()方法中进行查询操作,要知道,这个方法回调是在只要edittext中有变化都会执行,拿一个电话号码查询例子来说,用户如果输11位,那么就要查询11次,用于展示搜索结果的adapter就会刷新11次,当用户输入的快慢不同,这个adapter中list所带的查询返回的数据是肯定会用问题的,查询的数据池中,数据可能只有几十条么?况且不说网络状况好用户当前手机的内存的问题,所以这种做法是一定不能用的。

我的做法是,用handler+延时,下面请看:

 private InputHandler mInputHandler = new InputHandler();
 private boolean flags= false;//判断用户两次输入的时差是否大于500ms的标志

 private long firstTime;//第一次的时间

......

inputText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                 firstTime= System.currentTimeMillis();                
                if (!flags) {//已经进行了一次查询操作,就不在查询了
                    doQurry();
                }
            }
            @Override

            public void afterTextChanged(Editable s) {

            }

        });

 private class InputHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1://1输入完成                 
                    doQurry();
                    break;
            }
        }

    }

/*

*延时操作

**/

  private void doQurry() {
        flags= true;    //一进入这个方法就置为true,表示已经执行过了,如果不置为true,则会一直执行这个方法,要出大问题 

        if (System.currentTimeMillis() - firstTime> 500) {//当前时间和上一次输入的时差大于500ms就

           getUserData();
            flags= false;//重置为false,如果用户有新的输入才能进行下次查询,一定不要忘记这个flags
        } else {
            mInputHandler.sendEmptyMessageDelayed(1, 300);//edittext改变了,但是时间小于500ms(表示用户输入太快,在时间间隔的500ms内不查询)就每隔300ms给handler发送一次消息,直到这次操作完了进行一次查询操作完成。
        }
    }

/*

*网络查询操作,这个方法里面做你想做的事情

**/

private void getUserData(){

}


好了,上面就是我的操作,我想说下:作为一个程序员,做事情还是有点责任心,不要弄些表象,遇到问题总想偷懒,不找合理的解决方法,你提升技能很慢的,另外,程序员,不应该只有代码和电脑,还应该有年轻人应该有的活力,come on!!!

更多相关文章

  1. 获取高德key
  2. 关于更新UI
  3. 实现查询地址和路线导航的代码
  4. android事件4-onTouchEvent, onClick及onLongClick的调用机制
  5. DroidInfo v0.2.1 手机信息查询应用
  6. [android]adb remount失败的解决方法
  7. Python3+appium环境搭建
  8. Android获取SD卡上图片和视频缩略图的几个例子
  9. android之PackageManager简单介绍

随机推荐

  1. 这次鹿哥的福利不会让你们失望!
  2. 谈一谈我扎心的求学经历!
  3. GitHub的注册,代码仓库的创建,用小乌龟上传
  4. 老前辈和我讲述了前后端十几年的发展历程
  5. 动画:浅谈后台 MVC 模型与 MVVM 双向绑定
  6. 动画:扫盲 Git 版本控制
  7. 吭哧吭哧写了两年,所有文章分类汇总!
  8. 面试官:MySQL怎么查看表占用空间大小
  9. 你是如何变的自律的?
  10. 官方示例(十二):网页加载道路及Geoline开发T