美文网首页程序员Android深入
Android 万能防抖,包括但不限于点击防抖/数据防抖/事件触

Android 万能防抖,包括但不限于点击防抖/数据防抖/事件触

作者: Alex富贵 | 来源:发表于2020-08-21 11:26 被阅读0次

    需求

    原本是配合黄油刀的点击事件做点击防抖,例如:

    @OnClick({R.id.user_home_back, R.id.user_home_edit, R.id.user_home_more, R.id.user_home_follow, R.id.user_home_chat, R.id.user_home_to_order})
        public void onViewClicked(View view) {
            if (AntiShake.check(view.getId())) return;
            switch (view.getId()) {
                case R.id.user_home_back:
                    killMyself();
                    break;
                //编辑个人资料
                case R.id.user_home_edit:
                    launchActivity(new Intent(this, EditUserDataActivity.class));
                    break;
                  ........代码略
    

    后来做了一个串口的需求,那个串口的数据没有经过处理所以需要在代码中处理数据流,也就会导致读取到同一个ic卡会不停的触发读取卡片后面的逻辑.
    以前的代码已经丢掉了,这次重写了一个
    需要注意的是,默认使用场景是同一个Activity里有不超过200个可以在一秒内同时点击的View,或者会同时读取/处理超过200个不同的数据,才需要扩大200这个参数(请忽略我用魔法值哈哈哈).正常页面中,size() > 50应该就够用了,合理修改这个参数可以减少内存支出.

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * ================================================
     * Description:
     * <p>
     * Created by Alex on 2020/6/10 0010
     * <p>
     * 页面内容介绍: 使用方法: 在任何需要拦截的地方(任何对象/点击/执行方法等) 加入 if (AntiShake.check(position)) return; 或 if (AntiShake.check(position, 1500)) return;
     * <p>
     * ================================================
     */
    public class AntiShake {
        private static Map<String, Long> map = new LinkedHashMap<String, Long>() {
            @Override
            protected boolean removeEldestEntry(Entry<String, Long> pEldest) {
                return size() > 200;
            }
        };
    
        public static boolean check(Object obj) {
            return check(obj, 1000);
        }
    
        public static boolean check(Object obj, int delayTime) {
            Long time = map.get(obj.toString());
            if (time == null) {
                map.put(obj.toString(), System.currentTimeMillis());
                return false;
            } else {
                boolean b = System.currentTimeMillis() - time <= delayTime;
                if (!b) map.put(obj.toString(), System.currentTimeMillis());
                return b;
            }
        }
    }
    

    LinkedHashMap相关的内容:

    JAVA 如何限制一个Map的Size

    相关文章

      网友评论

        本文标题:Android 万能防抖,包括但不限于点击防抖/数据防抖/事件触

        本文链接:https://www.haomeiwen.com/subject/ohkujktx.html