Android优雅地处理按钮重复点击的几种方法
App中,有很大一部分场景是点击按钮,向服务端提交数据,由于网络请求需要时间,用户很可能会多次点击,造成数据重复提交,造成各种莫名其妙的问题。
因此,防止按钮多次点击,是Android开发中一个很重要的技术手段。
以前的处理方式
网上查找到的,或者你可能会想到的方法大概有这些:
1.每个按钮点击事件中,记录点击时间,判断是否超过点击时间间隔
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class ClickActivity extends AppCompatActivity { private long mLastClickTime = 0 ; public static final long TIME_INTERVAL = 1000L; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_click); findViewById(R.id.btn_button2).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { long nowTime = System.currentTimeMillis(); if (nowTime - mLastClickTime > TIME_INTERVAL) { // do something mLastClickTime = nowTime; } else { Toast.makeText(ClickActivity. this , "不要重复点击" , Toast.LENGTH_SHORT).show(); } } }); } } |
这种方式,每个点击事件都需要写一个时间判断,重复代码很多。
2.封装一个点击事件,处理点击间隔判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public abstract class CustomClickListener implements View.OnClickListener{ private long mLastClickTime; private long timeInterval = 1000L; public CustomClickListener() { } public CustomClickListener( long interval) { this .timeInterval = interval; } @Override public void onClick(View v) { long nowTime = System.currentTimeMillis(); if (nowTime - mLastClickTime > timeInterval) { // 单次点击事件 onSingleClick(); mLastClickTime = nowTime; } else { // 快速点击事件 onFastClick(); } } protected abstract void onSingleClick(); protected abstract void onFastClick(); } |
使用:
1 2 3 4 5 6 7 8 9 10 11 | findViewById(R.id.btn_button).setOnClickListener( new CustomClickListener() { @Override protected void onSingleClick() { Log.d( "xxx" , "onSingleClick" ); } @Override protected void onFastClick() { Log.d( "xxx" , "onFastClick" ); } }); |
相比于第一种方式,这种方法将重复点击的判断封装在CustomClickListener内部,外部无需处理时间判断,只需要实现点击方法即可。
3.利用RxAndroid处理重复点击
1 2 3 4 5 6 7 8 | RxView.clicks(view) .throttleFirst( 1 , TimeUnit.SECONDS) .subscribe( new Consumer<Object () { @Override public void accept(Object o) throws Exception { // do something } }); |
响应式地处理按钮点击,利用rxjava的操作符,来防止重复点击,相较于第1,2方案来说,此方法更为优雅一些。
4、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class ButtonUtils { private static long lastClickTime = 0 ; private static long DIFF = 1500 ; private static int lastButtonId = - 1 ; /** * 判断两次点击的间隔,如果小于1000,则认为是多次无效点击 * * @return */ public static boolean isFastDoubleClick() { return isFastDoubleClick(- 1 , DIFF); } /** * 判断两次点击的间隔,如果小于1000,则认为是多次无效点击 * * @return */ public static boolean isFastDoubleClick( int buttonId) { return isFastDoubleClick(buttonId, DIFF); } /** * 判断两次点击的间隔,如果小于diff,则认为是多次无效点击 * * @param diff * @return */ public static boolean isFastDoubleClick( int buttonId, long diff) { long time = System.currentTimeMillis(); long timeD = time - lastClickTime; if (lastButtonId == buttonId && lastClickTime > 0 && timeD < diff) { Log.v( "isFastDoubleClick" , "短时间内按钮多次触发" ); return true ; } lastClickTime = time; lastButtonId = buttonId; return false ; } } |
使用
1 2 3 | if (!ButtonUtils.isFastDoubleClick(R.id.login_btn)) { //多次点击 } |
参考于:https://cloud.tencent.com/developer/article/1742592
分类:
工具
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2016-09-21 gson解析