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

需求

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

@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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。