返回顶部
首页 > 资讯 > 精选 >Android开发如何解决安卓重复点击问题
  • 117
分享到

Android开发如何解决安卓重复点击问题

2023-07-02 09:07:15 117人浏览 泡泡鱼
摘要

这篇文章主要介绍“Android开发如何解决安卓重复点击问题”,在日常操作中,相信很多人在Android开发如何解决安卓重复点击问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发如何解决安卓

这篇文章主要介绍“Android开发如何解决安卓重复点击问题”,在日常操作中,相信很多人在Android开发如何解决安卓重复点击问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发如何解决安卓重复点击问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

抛出问题

“大哥,有个问题想问你!”

“哎,说吧(内心戏:咋又来了。。。准没好事!)”

“我的一个页面中有一个查询按钮,点击就会发出网络请求,等待返回结果后更新数据。”

“这不挺好的嘛!有啥问题啊?”

“对,我也觉得没问题,但测试不按套路出牌啊,测试那边的网络不太好,她点击按钮之后由于网络比较慢就快速多点击了几下,然后。。。”

“然后怎么了?ANR了吧?”

“你咋知道的大哥?”

“来吧,帮您看看吧!”

日常开发中肯定遇到过这种情况,接下来咱们就来看看该怎么解决这种问题。

第一种:弹窗等待

“小子,过来,你看啊,你可以这样,当你点击了按钮之后就弹出一个对话框,设置成不能关闭,等网络请求完成之后再将对话框关闭了就行”

“这是一种方式,但我该怎么写呢?”

“哎,给你写一下例子吧:照着下面代码写就行”

    public void btnDialog(View view) {        ProgressDialog progressDialog = new ProgressDialog(this);        progressDialog.setTitle("等待");        progressDialog.setMessage("等待内容");        //progressDialog.setCanceledOnTouchOutside(false);        progressDialog.show();    }

上面代码很简单,这只是一种思路,点击按钮后可以弹出对话框不让用户进行操作(注释的那一行代码就是禁止用户点击的),当请求完成之后再将对话框关闭。

不过不推荐这种做法,官方也不推荐,官方推荐使用ProgressBar。

第二种:禁止点击

“大哥,我觉得弹出对话框不太好,会让用户很反感,还有别的方式吗?”

“行了,早就准备好和你说了,还不止一种呢!这种方式更简单了,只需要设置按钮是否可以点击就行,当用户点击后设置按钮不可点击,请求完成之后再设置可以点击就行了,这个不用我写代码了吧?“

”嘿嘿,这个不用,你刚才说还有好几种,说来听听啊!“

第三种:时间判断

这种方式比上面的稍微麻烦点,但还是很简单。

具体操作就是定义两个变量,一个为上次点击时间,一个为点击的间隔时间。

// 上次点击时间private long lastClickTime = 0L;// 两次点击间隔时间(毫秒)private static final int FAST_CLICK_DELAY_TIME = 1500;

在点击时进行判断就可以了,来看一下代码吧:

public void btnInter(View view) {  if (System.currentTimeMillis() - lastClickTime >= FAST_CLICK_DELAY_TIME)      lastClickTime = System.currentTimeMillis();  }}

"大哥,这种方法看着比上面两种好用多了,只需要这样定义一下就行了,我就用这一种啊!"

“先别高兴的太早了!”

第四种:aop实现

“大哥,你刚才说我高兴的太早了是为啥啊?“

”你只有一个页面的话这样写肯定是没有问题的,但是如果有多个页面都有防止按钮重复点击的需求呢?每个页面都定义一遍啊?“

”呃呃,你说的对,大哥,那应该怎么办呢?“

”你知道AOP吗?接下来我要说的就和它有关“

”AOP?那是什么鬼?我知道OOP!“

”不错啊小子,还知道OOP,OOP就是面向对象,而AOP就是面向过程。“

AOP为Aspect OrientedProgramming的缩写,意为面向切面编程。所谓的面向切面编程其实是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来做成一种服务(比如日志记录,性能统计等),从而实现代码复用。另外这种服务通过配置可以动态的给程序添加统一控制,利用AOP可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度降低。

AOP并不是Android中的产物,而是Java中的,Android官方并没有提供,所以想使用AOP首先要导入可以实现AOP的三方库:

项目级别的build.gradle中新增以下代码:

classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'

然后在moudle的build.gradle中新增依赖:

implementation 'org.aspectj:aspectjrt:1.8.14'

还需要在moudle的build.gradle中最上面添加以下代码:

apply plugin: 'android-aspectjx'

完事之后点击sync Now更新一下。

因为想在所有地方都能使用,所以来定义一个注解:

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SingleClick {        long value() default 1500;}

注解大家应该都使用过,运行时就不说了,使用范围定义的是方法上,有一个参数为间隔时间,这个参数意思其实和第三种方案中的类似。

然后就需要定义一个类,里面实现AOP的具体操作:

@Aspectpublic class SingleClickAspect {}

然后定义切点,标记切点为所有被@SingleClick的方法:

    @Pointcut("execution(@com.zj.sinGClick.SingleClick * *(..))")    public void methodAnnotated() {    }

这里要注意包名和类名一定要写对。

接下来定义一个切面方法,包裹着切点方法:

    @Around("methodAnnotated()")    public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {        View view = null;        for (Object arg : joinPoint.getArgs()) {            if (arg instanceof View) {                view = (View) arg;                break;            }        }        if (view == null) {            return;        }        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();        Method method = methodSignature.getMethod();        if (!method.isAnnotationPresent(SingleClick.class)) {            return;        }        SingleClick singleClick = method.getAnnotation(SingleClick.class);        if (!isFastDoubleClick(view, singleClick.value())) {            joinPoint.proceed();        }    }

来简单分析下,首先看注解中定义了刚才定义的切点方法,然后取出方法的参数,再取出方法的注解,然后调用

isFastDoubleClick方法判断是否为快速点击事件,如果是什么都不干,如果不是则执行原方法中的内容。

下面贴一下isFastDoubleClick方法的代码:

    private static long mLastClickTime;    private static int mLastClickViewId;    private static boolean isFastDoubleClick(View v, long intervalMillis) {        int viewId = v.getId();        long time = System.currentTimeMillis();        long timeInterval = Math.abs(time - mLastClickTime);        if (timeInterval < intervalMillis && viewId == mLastClickViewId) {            return true;        } else {            mLastClickTime = time;            mLastClickViewId = viewId;            return false;        }    }

上面代码采用了View的id和间隔时间双重判断,即使一个页面的多个按钮都可区分。

“大哥,停停停,都给我说懵了,这写完这个该怎么用啊!”

“别着急,下面就教你该怎么使用!”

使用很简单,只需要在点击时间方法上加上咱们自定义的注解就行了,还可以设置间隔时间,如果不写的话就是默认值,上面也写了,默认值就是1500毫秒。

    @SingleClick(2000)    public void btnAop(View view) {        ToastUtils.showShort("btnAop");        Log.e(TAG, "btnAop");    }

“是不是很简单啊?”

“大哥,我也不想写这一大堆,我只想用,你能封装成一个库吗?我用的时候直接调用就行!”

“哎,行吧,我封装一下。。。。”

封装

“我已经将上面第四种方式封装为了一个库并上传到了JitPack库,下面给你说一下使用方法吧!”

使用方法很简单,需要几步配置,配置完成之后直接添加注解即可使用,下面是配置方法: 1、在项目的build.gradle中的buildscript中的dependencies添加:

 dependencies {        ...        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4' }

在项目的build.gradle中的allprojects中的repositories添加:

allprojects {    repositories {        ...        Maven { url 'https://jitpack.io' }    }}

在app的build.gradle中的最上面添加

apply plugin: 'android-aspectjx'

在app的build.gradle中的dependencies添加

implementation 'com.GitHub.zhujiang521:AndroidAOP:1.0.1'

在你需要使用的方法上面添加上注解即可:

    @SingleClick(2000)    public void btnAop(View view) {        ToastUtils.showShort("btnAop");        Log.e(TAG, "btnAop");    }

“小子,会用了吗?”

”对了大哥,我的项目中用的是Kotlin啊,我看你写的都是Java,我那里面能用嘛!”

“吆喝,还Kotlin呢,放心吧,一样使用!”

@SingleClick    override fun onClick(v: View?) {        if (v != null) {            when(v.id){                R.id.btnClick ->{                    ToastUtils.showShort("哈哈哈")                    Log.e("哈哈哈","wwww")                }            }        }    }

到此,关于“Android开发如何解决安卓重复点击问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Android开发如何解决安卓重复点击问题

本文链接: https://lsjlt.com/news/340955.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android开发如何解决安卓重复点击问题
    这篇文章主要介绍“Android开发如何解决安卓重复点击问题”,在日常操作中,相信很多人在Android开发如何解决安卓重复点击问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发如何解决安卓...
    99+
    2023-07-02
  • Android开发一行代码解决安卓重复点击
    目录抛出问题第一种:弹窗等待第二种:禁止点击第三种:时间判断第四种:AOP实现封装总结抛出问题 “大哥,有个问题想问你!” “哎,说吧(内心戏:咋...
    99+
    2024-04-02
  • 实例详解Android解决按钮重复点击问题
     为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击。具体实例代码如下所示: public class BaseActivity ext...
    99+
    2022-06-06
    按钮 Android
  • Vue路由重复点击报错问题及解决
    目录vue路由重复点击时会出现报错局部处理全局处理vue 重复点击菜单,路由重复报错解决报错原因解决方法总结vue路由重复点击时会出现报错 Uncaught (in promise)...
    99+
    2023-05-14
    Vue路由 路由重复点击报错 路由重复点击
  • vue如何处理防止按钮重复点击问题
    目录处理防止按钮重复点击vue防止重复执行点击事件方法一:在规定时间内将按钮禁用的方法方法二:用指令的方式实现,全局注册 处理防止按钮重复点击 1.在button上绑定动态...
    99+
    2024-04-02
  • Android开发sensor旋转屏问题如何解决
    这篇文章主要讲解了“Android开发sensor旋转屏问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发sensor旋转屏问题如何解决”吧!一、查询 activi...
    99+
    2023-07-05
  • Vuerouter/Element重复点击导航路由报错问题及解决
    目录Vue router/Element重复点击导航路由报错解决方法如下Vue使用element-UI路由报错问题报错代码修改方案Vue router/Element重复点击导航路由...
    99+
    2022-11-13
    Vue router重复点击 Vue Element重复点击 重复点击导航路由
  • Vue路由重复点击报错如何解决
    这篇文章主要介绍“Vue路由重复点击报错如何解决”,在日常操作中,相信很多人在Vue路由重复点击报错如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue路由重复点击报错如何解决”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • java8toMap问题(key重复如何解决)
    目录java8 toMap(key重复解决)Collectors.toMap的key重复解决方案一解决方案二java8 toMap(key重复解决) 使用stream的toMap()...
    99+
    2024-04-02
  • 如何解决重复内容问题
    重复内容是SEO中常见的问题,它可能影响搜索引擎排名和网站信誉。解决重复内容问题主要包括:1、内容审查和识别、2、使用Canonical标签、3、301重定向、4、添加无索引元标签、5、优化内部链接结构、6、利用搜索引擎控制台工具。定期检查...
    99+
    2023-10-29
    如何解决 内容
  • Android如何优雅的处理重复点击
    目录之前的处理方式 现在的处理方式 其他场景处理重复点击 间接设置点击 富文本 列表 数据绑定 总结 项目地址 一般手机上的 Android App,主要的交互方式是点击。用户在点击...
    99+
    2024-04-02
  • web开发中如何优雅的解决"重复请求"问题
    目录前言提出问题解决思路axios 如何取消请求封装axios准备工作开始封装总结前言 在我们web开发过程中,很多地方需要我们取消重复的请求。但是哪种场合需要我们取消呢?我们如何取...
    99+
    2024-04-02
  • 如何解决点击 tomcat9.exe闪退的问题
    有读者联系问,怎么tomcat启动都会出现问题,刚下载完还没开始操作。在这里说下怎么解决这个问题。 一、 问题描述 双击执行 startup.bat 可以正常启动,接着启动 tomc...
    99+
    2024-04-02
  • web开发中如何解决自定义事件解决重复请求BUG的问题
    这篇文章将为大家详细讲解有关web开发中如何解决自定义事件解决重复请求BUG的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。BUG的背景最近在开发一个组件,好不容易开...
    99+
    2024-04-02
  • 如何解决ElementUI导航栏重复点菜单报错问题
    目录ElementUI 导航栏重复点菜单报错ElementUI 菜单导航重定向报错处理ElementUI 导航栏重复点菜单报错 在使用ElementUI中的导航时,默认情况下如果重复...
    99+
    2022-11-13
    ElementUI导航栏 重复点菜单报错 ElementUI重复点菜单
  • Android开发中怎么解决Fragment +Viewpager滑动页面重复加载的问题
    这篇文章给大家分享的是有关Android开发中怎么解决Fragment +Viewpager滑动页面重复加载的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言 之前在做一个Viewpager上面加载多个Fr...
    99+
    2023-05-30
    android fragment viewpager
  • Android如何解决所有双击优化的问题
    今天小编给大家分享一下Android如何解决所有双击优化的问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。transfor...
    99+
    2023-07-02
  • 如何解决redis击穿问题
    这篇文章将为大家详细讲解有关如何解决redis击穿问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。击穿:指的是单个key在缓存中查不到,去数据库查询,这样如果数据量不大...
    99+
    2024-04-02
  • 怎么解决vue点击弹窗自动触发点击事件的问题
    这篇文章给大家分享的是有关怎么解决vue点击弹窗自动触发点击事件的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。业务场景:使用vue +element ui 的el-dialog,点击弹窗之后,默认加载第一个...
    99+
    2023-06-15
  • 如何解决webpack dll打包重复问题
    这篇文章主要介绍了如何解决webpack dll打包重复问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关于webpack dll的使用,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作