随笔 - 245  文章 - 0  评论 - 11  阅读 - 49万

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

posted on   巫山老妖  阅读(504)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2016-09-21 gson解析
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示