Android安卓关于避免按钮快速多次点击问题解决办法
2016-09-08 14:12
477 查看
闲话不多,直接干货
在我寻找之下,大概分为三种解决办法.
方法一:在点击事件的开始把它设为不可点击,再在点击事件的结束设置为可点击
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btnStartLive:
//这个是防止用户多次点击,造成方法多次执行,出现错误
btStartLive.setClickable(false);
//gowhere()方法是自己写的 点击事件想要执行的方法
gowhere();
//这个也是防止用户多次点击,造成方法多次执行,出现错误 与btStartLive.setClickable(false);相呼应
btStartLive.setClickable(true);
break;
default:
break;
}
}
优点:简单便利,易上手,,,,
缺点:如果gowhere()开启子线程 既没有多大用了 但是如果在子线程中 写btStartLive.setClickable(true);方法 会出现一种情况, 如果子线程执行方法执行中出现问题,执行不到这个方法,或者说是如果程序逻辑复杂多变 会出现很多种情况,既有接口回调,调用sdk 还有开启多个子线程 ,这个方法根本不行.
方法二:自定义点击事件 :设置每隔几秒才可以点击下一次
public abstract class NoDoubleClickListener implements OnClickListener {
//每隔5000点击一次 MIN_CLICK_DELAY_TIME 为设置的间隔单位是毫秒
public static final int MIN_CLICK_DELAY_TIME = 5000;
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);
}
}
protected void onNoDoubleClick(View v) {
}
}
在代码中调用:
//其中的button为自己布局中的按钮
button= (Button) findViewById(R.id.btnStartLive);
button.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
Toast.makeText(ReleaseLiveActivity.this, "点击,,点击", Toast.LENGTH_SHORT).show();
}
});
这样就每隔5秒钟可以点击一次了
网上虽然有很多的例子 但是 总是少了 protected void onNoDoubleClick(View v) { }这一行代码. 也许初学者会有些疑问.
优点:两次点击每隔时间可以固定 避免了连续点击的执行的bug
缺点:两次点击之间的时间虽然固定,但是这个值 多少秒 这个值不好确定,如果时间长 用户体验太差,时间特别短,如果里面有子线程 可能子线程的还没执行完毕
方法三:
我们优雅一点,使用throttleFirst操作符来解决按钮被多次点击的问题,当然这涉及到RxJava了,
笔者没有研究这种办法,感觉这种办法不太常用吧.
在我寻找之下,大概分为三种解决办法.
方法一:在点击事件的开始把它设为不可点击,再在点击事件的结束设置为可点击
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btnStartLive:
//这个是防止用户多次点击,造成方法多次执行,出现错误
btStartLive.setClickable(false);
//gowhere()方法是自己写的 点击事件想要执行的方法
gowhere();
//这个也是防止用户多次点击,造成方法多次执行,出现错误 与btStartLive.setClickable(false);相呼应
btStartLive.setClickable(true);
break;
default:
break;
}
}
优点:简单便利,易上手,,,,
缺点:如果gowhere()开启子线程 既没有多大用了 但是如果在子线程中 写btStartLive.setClickable(true);方法 会出现一种情况, 如果子线程执行方法执行中出现问题,执行不到这个方法,或者说是如果程序逻辑复杂多变 会出现很多种情况,既有接口回调,调用sdk 还有开启多个子线程 ,这个方法根本不行.
方法二:自定义点击事件 :设置每隔几秒才可以点击下一次
public abstract class NoDoubleClickListener implements OnClickListener {
//每隔5000点击一次 MIN_CLICK_DELAY_TIME 为设置的间隔单位是毫秒
public static final int MIN_CLICK_DELAY_TIME = 5000;
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);
}
}
protected void onNoDoubleClick(View v) {
}
}
在代码中调用:
//其中的button为自己布局中的按钮
button= (Button) findViewById(R.id.btnStartLive);
button.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onNoDoubleClick(View v) {
Toast.makeText(ReleaseLiveActivity.this, "点击,,点击", Toast.LENGTH_SHORT).show();
}
});
这样就每隔5秒钟可以点击一次了
网上虽然有很多的例子 但是 总是少了 protected void onNoDoubleClick(View v) { }这一行代码. 也许初学者会有些疑问.
优点:两次点击每隔时间可以固定 避免了连续点击的执行的bug
缺点:两次点击之间的时间虽然固定,但是这个值 多少秒 这个值不好确定,如果时间长 用户体验太差,时间特别短,如果里面有子线程 可能子线程的还没执行完毕
方法三:
我们优雅一点,使用throttleFirst操作符来解决按钮被多次点击的问题,当然这涉及到RxJava了,
笔者没有研究这种办法,感觉这种办法不太常用吧.
相关文章推荐
- 关于WinForm框架中点击按钮时存在的多次提交问题的解决方法
- 连续点击按钮后多次发送数据问题的解决办法
- 避免用户多次点击提交表单的解决办法
- 关于表单提交按钮多次点击多次触发的解决方法
- ios 防止按钮快速点击造成多次响应的避免方法。
- 关于修复VS2008提示加载安装组件出现问题和点击VS的设计窗口出现一个WINDOW installer的提示的问题的解决办法
- 关于因连续快速点击UIButton,造成内存溢出的一种解决办法
- 避免点击触发多个按钮和快速点击多次触发事件
- android专题解决之按钮快速点击重复调用问题
- 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理
- 31.ios 防止按钮快速点击造成多次响应的避免方法。 取消正在执行中的方法
- ios 防止按钮快速点击造成多次响应的避免方法。
- 关于MyEclipse 点击部署项目按钮无响应解决办法
- ios 防止按钮快速点击造成多次响应的避免方法
- ios 防止按钮快速点击造成多次响应的避免方法。
- ios 防止按钮快速点击造成多次响应的避免方法。
- 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理
- 关于因连续快速点击UIButton,造成内存溢出的一种解决办法
- ios 防止按钮快速点击造成多次响应的避免方法。
- 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理