final FDurationBlocker blocker = new FDurationBlocker(1000); //设置默认拦截间隔为1000毫秒
btn_click.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//if (blocker.block(1000)) //动态指定拦截间隔为1000毫秒
if (blocker.block())
{
//拦截掉
return;
}
mClickCount++;
btn_click.setText(String.valueOf(mClickCount)); // 更新点击次数
}
});
内部基于FDurationBlocker实现的点击拦截,可以设置全局拦截间隔和单独对某个view设置拦截间隔
效果图:
//未拦截Button
findViewById(R.id.btn_normal).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mClickCount++;
tv_click_count.setText(String.valueOf(mClickCount)); //更新点击次数
}
});
//全局拦截Button,拦截间隔为1000毫秒
FOnClickBlocker.setGlobalBlockDuration(1000); //设置全局拦截间隔
FOnClickBlocker.setOnClickListener(findViewById(R.id.btn_global), new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mClickCount++;
tv_click_count.setText(String.valueOf(mClickCount)); //更新点击次数
}
});
//单独拦截Button,拦截间隔为2000毫秒
FOnClickBlocker.setOnClickListener(findViewById(R.id.btn_private), 2000, new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mClickCount++;
tv_click_count.setText(String.valueOf(mClickCount)); //更新点击次数
}
});
应用场景:直播间聊天公屏要求用户发消息限制为最快只能2秒发一次,并且如果有重复的消息的话必须间隔5秒才能发
效果图:
final FEqualsDurationBlocker blocker = new FEqualsDurationBlocker();
blocker.setMaxEqualsCount(0); //设置允许最大重复的次数0
btn_send_msg.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String msg = et.getText().toString();
if (TextUtils.isEmpty(msg))
{
Toast.makeText(EqualsDurationBlockerActivity.this, "请输入消息", 0).show();
return;
}
if (blocker.block(2000))
{
//拦截到间隔2000毫秒内的点击
Toast.makeText(EqualsDurationBlockerActivity.this, "消息间隔不能小于2秒", 0).show();
return;
}
if (blocker.blockEquals(msg) && blocker.block(5000))
{
//拦截到超过最大重复次数,并且间隔5000毫秒内的点击
Toast.makeText(EqualsDurationBlockerActivity.this, "重复消息间隔不能小于5秒", 0).show();
return;
}
blocker.saveLastLegalTime(); //保存通过拦截的合法时间点,下次判断用到
blocker.saveLastLegalObject(msg); //保存通过拦截的合法对象,下次判断用到
tv_msg.append("\r\n" + msg);
}
});
当某一种耗性能的相同任务需要频繁被执行的时候,可以用这个类来限制执行的频率
当调用postDelayed方法post一个延迟Runable之后,会有以下3种情况:
- 如果在延迟间隔内没有再次post,则延迟间隔到后执行该Runnable
- 如果在延迟间隔内再次post,并且拦截次数小于最大拦截次数,则取消已经post的延迟Runnable,重新post当前延迟Runnable,拦截次数加一
- 如果在延迟间隔内再次post,并且拦截次数大于最大拦截次数,则立即执行Runnable,重置拦截次数
模拟效果图:
public void onClickStart500(View view)
{
mBlocker.setMaxBlockCount(3); //设置延迟间隔内最大可以拦截3次,超过3次则立即执行
mLooper.start(500, new Runnable() //模拟每隔500毫秒请求执行一次的场景
{
@Override
public void run()
{
mBlocker.postDelayed(mTargetRunnable, 3000); //尝试post一个3000毫秒后执行的Runnable
mRequestCount++;
tv_block_msg.setText("请求执行次数:" + mRequestCount);
}
});
}
/**
* 模拟耗性能Runnable
*/
private Runnable mTargetRunnable = new Runnable()
{
@Override
public void run()
{
mRealCount++;
tv_msg.setText("实际执行次数:" + String.valueOf(mRealCount));
}
};