android 功能防抖,安卓按钮防抖动之终极解决方案

开发过程中,我们经常会用到OnClick点击事件,常用的写法可能是这样的:

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//TODO

}

});

或者是这样的:

btn.setOnClickListener(this);

@Override

public void onClick(View v) {

//TODO

}

正常情况下,这样的代码是没有什么问题的,但是大家都知道安卓碎片化严重,每个手机的性能也千差万别。想必大家都遇到过,在比较卡的手机上,快速点击按钮打开一个页面,结果发现这个页面被打开了两次...

一般这种情况下,我们会打开百度,看看万能的网友都是怎么处理这种问题的(当时我就是这么做的😳),搜索到的处理方式可能是这样的:

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//TODO

btn.setClickable(false);

btn.setEnabled(false);

}

});

也可能是这样的:

public abstract class NoDoubleClickListener implements OnClickListener {

public static final int MIN_CLICK_DELAY_TIME = 1000;

private long lastClickTime = 0;

@Override

public void onClick(View v) {

long currentTime = Calendar.getInstance().getTimeInMillis();

if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME{

lastClickTime = currentTime;

onNoDoubleClick(v);

}

}

public abstract void onNoDoubleClick(View v);

}

btn.setOnClickListener(new NoDoubleClickListener() {

@Override

public void onNoDoubleClick(View v) {

//TODO

}

});

还有的说用RxBinding,由于涉及到Rxjava相关的知识,篇幅原因,我这里就不过多描述,感兴趣的同学可以自行百度了解。

当然,上述几种方式均能达到防止按钮快速点击,但是其弊端也比较明显。先说第一种方式,这种方法虽然可以防止快速点击,但是其给体验上的影响还是非常大的,想想如果你这个按钮点击后会有网络请求,如果网络请求执行过程比较长的话,按钮一直无法被点击,会让用户以为出现了bug;方式二相比第一种方法,体验上倒是没什么问题,但是其弊端在于只能通过匿名内部类的方式注册点击事件,当出现一个界面按钮比较多,写起来代码就显得比较臃肿了。

说了这么多,是时候展示真正的技术了,不多BB,直接上代码。

首先我们定义一个点击事件接口

public interface OnLimitClickListener {

/**

* 按钮点击事件

* @param view

*/

void onClick(View view);

}

再定义一个抽象类对我们的点击事件做一层包装

public class OnLimitClickHelper implements View.OnClickListener {

public static final int LIMIT_TIME = 300;

private long lastClickTime = 0;

private OnLimitClickListener onLimitClickListener = null;

public OnLimitClickHelper(OnLimitClickListener onLimitClickListener){

this.onLimitClickListener = onLimitClickListener;

}

@Override

public void onClick(View v) {

long curTime = Calendar.getInstance().getTimeInMillis();

if (curTime - lastClickTime > LIMIT_TIME) {

lastClickTime = curTime;

if(onLimitClickListener != null){

onLimitClickListener.onClick(v);

}

}

}

}

ok,完工!😂😂😂

最后我们看看Activity的使用:

public abstract class MainActivity extends AppCompatActivity implements OnLimitClickListener {

private Button btn = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn = findViewById(R.id.btn);

btn.setOnClickListener(new OnLimitClickHelper(this));

}

@Override

public void onClick(View v) {

//TODO

}

}

觉得写的不错的朋友,帮忙点下喜欢,你们的支持是我创作的动力!大家有什么问题也可以在下方评论,有时间我会一一解答,感谢!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值