需求
原本是配合黄油刀的点击事件做点击防抖,例如:
@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;
}
}
}
网友评论