Android防止快速重复点击

Android防重点击,网上有很多实现方式:RxJava 的 throttleFirst()、Aspect AOP、记录点击时间。
总结了如下一种方式:本质是记录点击时间。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import android.view.View.OnClickListener;

public class OnClick {
     
  public static final long LIMIT_DURATION = 1500L;	//时间间隔:1500ms

  public OnClick() {
     
  }

  public static OnClickListener setOnClickListener(final OnClickListener raw) {
     
    return (OnClickListener)Proxy.newProxyInstance(OnClickListener.class.getClassLoader(), new Class[]{
     OnClickListener.class}, new InvocationHandler() {
     
      long lastTime;

      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     
        if (!"onClick".equals(method.getName())) {
     
          return method.invoke(raw, args);
        } else {
     
          long now = System.currentTimeMillis();
          if (now - this.lastTime >= OnClick.LIMIT_DURATION) {
     
            this.lastTime = now;
            return method.invoke(raw, args);
          } else {
     
            return null;
          }
        }
      }
    });
  }
}

使用示例:1500ms内只可点击一次
1.

button.setOnClickListener(OnClick.setOnClickListener(this));
button.setOnClickListener(OnClick.create(new View.OnClickListener() {
     
      @Override public void onClick(View view) {
     
        
      }
    }));

3.结合DataBinding

布局文件:

<layout>
	<data>
	    <import type="com.test.util.OnClick" />
	    <variable
	        name="mainModel"
	        type="com.test.MainViewModel"
	        />
	  </data>
	<Button
	        android:id="@+id/btn_test"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="test"
	        android:onClick="@{OnClick.create(mainModel.onClickListener)}"
	        />
</layout> 

com.test.MainModel.java中点击事件实现:

public View.OnClickListener onClickListener= new View.OnClickListener() {
     
    @Override
    public void onClick(View v) {
     
      // TODO click event
    }
  };

你可能感兴趣的:(Android,Java,android)