Android优雅的控制用户点击按钮的频率

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

首先代理用户实现的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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值