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:
 * 

* Created by Alex on 2020/6/10 0010 *

* 页面内容介绍: 使用方法: 在任何需要拦截的地方(任何对象/点击/执行方法等) 加入 if (AntiShake.check(position)) return; 或 if (AntiShake.check(position, 1500)) return; *

* ================================================ */ public class AntiShake { private static Map map = new LinkedHashMap() { @Override protected boolean removeEldestEntry(Entry 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 万能防抖,包括但不限于点击防抖/数据防抖/事件触发)