Android重复点击
只要手速够快,就能突破限制。以前版本的微信有没有发现过,打开朋友圈,点击速度够快的话会打开两个朋友圈Activity,返回需要返回两次。我猜朋友圈Activity的launchMode肯定不是SingleTop和SingleInstance模式。关于Activity启动模式参考《Activity四种启动模式》。
1、重复创建Activity问题
如果点击一个View,启动Activity的话会很麻烦。
对于launchMode为Standard的Activity来说,可能会启动多个Activity,只要手速够快。100ms~200ms左右。
![]()
对于launchMode为SingleTop或者SingleInstance的Activity,第一次点击会创建Activity执行onCreate()正常的生命周期,但是紧随其后的点击将会走onNewIntent()逻辑,因为Activity已经存在,无需创建。
![]()
2、避免重复点击
可以屏蔽短时间内多次点击,原理都是判断两次点击时间间隔。
2.1、工具方法
通过判断前后两次事件时间间隔,设定最小间隔
// 两次点击间隔不能少于1000ms
private static final int FAST_CLICK_DELAY_TIME = 1000;
private static long sLastClickTime;
public static boolean isFastClick() {
boolean flag = true;
long currentClickTime = System.currentTimeMillis();
if ((currentClickTime - sLastClickTime) >= FAST_CLICK_DELAY_TIME) {
flag = false;
}
sLastClickTime = currentClickTime;
return flag;
}2.2、OnClickListener判断点击间隔
和第一个方法一样,在给View设置的OnClickListener中判断两次点击事件的间隔,间隔太多就不作处理了。
//全局定义
private long lastClickTime = 0L;
// 两次点击间隔不能少于1000ms
private static final int FAST_CLICK_DELAY_TIME = 1000;
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME) {
return;
}
lastClickTime = System.currentTimeMillis();
//后面业务逻辑
}
};2.3、RxJava 的 throttleFirst()
参考RxJava具体使用
/**
* 防止重复点击
*
* @param target 目标view
* @param listener 监听器
*/
public static void preventRepeatedClick(final View target, final View.OnClickListener listener) {
RxView.clicks(target)
.throttleFirst(1, TimeUnit.SECONDS) //间隔1s
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
listener.onClick(target);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}2.4、AOP来解决重复点击
AOP来解决重复点击,参考《Android优雅地处理按钮重复点击》

