Android优雅地处理按钮重复点击的几种方法

App中,有很大一部分场景是点击按钮,向服务端提交数据,由于网络请求需要时间,用户很可能会多次点击,造成数据重复提交,造成各种莫名其妙的问题。

因此,防止按钮多次点击,是Android开发中一个很重要的技术手段。

以前的处理方式

网上查找到的,或者你可能会想到的方法大概有这些:

1.每个按钮点击事件中,记录点击时间,判断是否超过点击时间间隔

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.封装一个点击事件,处理点击间隔判断

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();
}

使用:

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处理重复点击

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、

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;
    }
}

 使用

if (!ButtonUtils.isFastDoubleClick(R.id.login_btn)) {//多次点击

}

  

 

  

 

参考于:https://cloud.tencent.com/developer/article/1742592

posted on 2022-09-21 15:01  巫山老妖  阅读(445)  评论(0编辑  收藏  举报