Android重复点击

QuibblerQuibbler 2020-03-03 约 7 分钟 1886 次阅读

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优雅地处理按钮重复点击》

相关推荐

WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175