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