我们经常要在程序里面控制用户点击按钮的频率,防止过多的触发逻辑造成卡顿。
实现其实很简单,用到了反射和代理。

首先代理用户实现的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);

当然,自己可以扩展一下代理类的逻辑,这其实就是代理模式的简单用法。

更多相关文章

  1. Android(安卓)自定义ScrollView可监控滑动方向、滑动到底部
  2. Android(安卓)开发之环境的搭建
  3. mac配置android和maven环境变量
  4. 深入源码分析non-sdk并绕过Android(安卓)9.0反射限制
  5. [Unity for android]Unity在安卓机上调试的测试环境搭建
  6. cordova打包app环境搭建
  7. 设置ubuntu Android(安卓)sdk环境变量
  8. Android使用静态变量传递数据
  9. android编译时如何决定一个APK等Module是否被自动编译到system.i

随机推荐

  1. 如何修改原有的Android应用和添加应用
  2. Android 焦点调试
  3. Android Studio 自定义日历的简单实现
  4. RobotFramework+AppiumLibrary 测试 andr
  5. android多渠道打包最快方案
  6. Android通知Header详解
  7. android属性android:largeHeap
  8. GridView 的基本使用
  9. Android编程点滴(14) -- Android中资源文
  10. 基本控件学习二 (多选框)