一个按钮触发了一个只应该被调用一次的操作。在执行该操作之前,单击处理程序会禁用并隐藏该按钮:
someButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someButton.setEnabled(false);
someButton.setClickable(false);
someButton.setVisibility(View.GONE);
performTaskOnce();
}
});
private void performTaskOnce() {
Log.i("myapp", "Performing task");
//Do something nontrivial that takes a few ms (like changing the view hierarchy)
}
虽然按钮立即被禁用,但仍然有可能通过快速点击多次来触发多个“onClick”事件(即performTaskOnce
被多次调用)。似乎这些onClick事件在按钮实际禁用之前被排队。
我可以通过在每个单独的onClick处理程序中检查相应的按钮是否已经被禁用来解决问题,但那似乎是一个hack。是否有更好的方法来避免这个问题?
该问题出现在Android 2.3.6上,在Android 4.0.3上我无法复现该问题。但考虑到4.x设备的罕见性,排除旧设备并不是一个选项。