Android优雅的控制用户点击按钮的频率
来源:互联网 发布:js实现图片轮播 编辑:程序博客网 时间:2024/03/29 21:04
我们经常要在程序里面控制用户点击按钮的频率,防止过多的触发逻辑造成卡顿。
实现其实很简单,用到了反射和代理。
首先代理用户实现的OnClickListener接口。
public class ClickProxy implements View.OnClickListener{ private View.OnClickListener origin; private long lastclick = 0; private long timems; //ms public ClickProxy(View.OnClickListener origin, long timems) { this.origin = origin; this.timems = timems; } @Override public void onClick(View v) { if (System.currentTimeMillis() - lastclick >= timems){ origin.onClick(v); lastclick = System.currentTimeMillis(); } }}
这里不需要解释,我只是实现了比较简单的控制方式,即每隔固定的时间允许click一次。
如果还没有设置监听,直接代理就好了。
如果已经设置了监听。就需要反射替换View类中的私有OnClickListener变量。他存在于View中的ListenerInfo静态类中的mOnClickListener变量。
public class ClickFilter { public static void setFilter(View view,long ms){ try { Field field = View.class.getDeclaredField("mListenerInfo"); field.setAccessible(true); Class listInfoType = field.getType(); Object listinfo = field.get(view); Field onclickField = listInfoType.getField("mOnClickListener"); View.OnClickListener origin = (View.OnClickListener) onclickField.get(listinfo); onclickField.set(listinfo,new ClickProxy(origin,ms)); } catch (Exception e) { e.printStackTrace(); } }}最后测试一下
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,”click”,Toast.LENGTH_LONG).show();
}
});
ClickFilter.setFilter(button,10000);
当然,自己可以扩展一下代理类的逻辑,这其实就是代理模式的简单用法。
0 0
- Android优雅的控制用户点击按钮的频率
- Android 中Button点击频率的控制
- Android 按钮点击频率控制设计
- android 高频率的点击事件
- 优雅的获取TextView用户点击的链接
- ios 控制button点击事件的触发频率
- android中button点击频率控制
- android中button点击频率控制
- android中button点击频率控制
- android中button点击频率控制
- android 控制触发频率的一种方式
- android 防止用户点击频率过高
- iOS用户点击退出按钮,跳到登录界面的代码控制
- 控制其它窗体的按钮点击事件
- 代码控制按钮点击事件的触发
- iOS 防止用户不停的点击按钮
- android的按钮点击事件
- android 按钮的点击缩放
- cvte pentest
- FZU Problem 2232 炉石传说(匈牙利算法)
- 292. Nim Game
- Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知
- 关于分布式事务、两阶段提交协议、三阶提交协议
- Android优雅的控制用户点击按钮的频率
- 【数据结构】绪论 总结
- 介绍 JSON
- Dijkstra堆优化
- 管道命令
- linux 磁盘分区
- 初涉java(swing常用组件及绘图原理)
- C语言位运算符
- 尚学堂js面向对象开发 (五)两种创建对象的方式(工厂方式,构造方法)