Android重复点击

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

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

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w