该问题始于真实案例中:
在做公司项目的时候,移交测试的时候,反馈连续点击提交信息的按钮,会多次post数据到服务器,导致产生了错误的重复数据
在网上寻找答案,发现网上的答案多数是创建一个新的myButton类继承button,重写其中的方法或者增加接口等类似做法,进行计时,一秒内或者一段时间内,无法再次触发业务
逻辑,显然这种办法简单粗暴,但是不可控,谁能知道业务逻辑是在多长的时间内完成呢,因此我按照自己的思路,较为成功的解决了该问题,下面上图
这是我在基类里写的点击监听方法,在点击事件触发抽象方法(该抽象和传统onClick作用一致,只是做了一层封装),代码很少,逻辑也很简单,就是在点击一次后,设置该view不可再被点击
这里是我封装的网络请求的类,道理和如上的点击监听一样,只是单纯的封装,但是比一般的网络请求多传了一个参数View,逻辑同样很简单,效果却很暴力,这样做无论业务逻辑需要处理多久,在处理过程中,点击事件始终不会被触发,直到业务逻辑处理完毕,点击事件再次被激活
PS:如有更好的解决方案,欢迎留言交流
----------------------------------------------------------
最近对此法进行了优化改良,以下是图文
这里我们创建一个接口,并且不需要实现任何方法,仅作为一个标记,同时还能再创建一个接口(该接口与本文单次点击无关,仅作为补充说明)
然后去自定义我们的按钮,实现SingleClick这个接口
如上图,由于该接口没有任务方法,仅为一个标记,所以自定义的按钮类同样不需要实现任何方法
接下来在基类BaseActivity中去操作抽象的逻辑
看到这里应该明白了吧...在onClick方法里,凡是实现了SingleClick接口的,一律点完以后设置为阻断,在onResume方法执行以后重新激活所有按钮(考虑点击按钮以后onPause以后再次获取焦点,按钮无法点击的情况),至于StartAnimator接口的逻辑仅为参考,大家可以自行设置需要的接口,进行各种各样复杂的逻辑判断。