我在那里当我按下一个按钮,它与Web服务,如果你双击该按钮将调用Web服务两次造成重复提交,我遇到的问题是通信的情况。任何想法如何防止按钮接受第二次点击?我看了这篇文章,但似乎解决方案不起作用。安卓双按钮提交
Android Preventing Double Click On A Button
我在那里当我按下一个按钮,它与Web服务,如果你双击该按钮将调用Web服务两次造成重复提交,我遇到的问题是通信的情况。任何想法如何防止按钮接受第二次点击?我看了这篇文章,但似乎解决方案不起作用。安卓双按钮提交
Android Preventing Double Click On A Button
禁用按钮是不够的,还应该使按钮无法点击与setClickable(false)
。
setEnabled()
只会更改按钮,这将继续接收点击事件的出现。
在我看来,最好的办法是控制运行Web服务。为您的Web服务通信设置一个布尔值。这样的事情(在伪代码,不记得的Android多)
private boolean webServiced = false;
public synchronized void startWebService(){
if (!webServiced){
webServiced = true;
//run your web service call on separate thread or something
}
}
public synchronized void onWebServiceDone(){
webServiced = false;
myButton.setClickable(true)
}
public void onButtonClick(Event e){
startWebService();
myButton.setClickable(false)
}
请告诉我这里重要的是WebService的方法需要被同步这样就可以保证只有一个线程在访问webServiced布尔时间。有了这个,即使用户在setClickable(false)开始前多次单击按钮,您的Web服务仍将只运行一次。
我认为这可行,但它是一个过于复杂的解决方案。我将正确地授予LadaRaider。 – EpicOfChaos 2011-12-16 04:12:07
这是一个通用的解决方案,你可以在你的代码中使用您的具体情况和其他地方上的任何按钮,甚至如果事件是一个异步调用。
然后为你的web服务端点,当你得到一个答复,超时或类似的,调用运行的通过,这将您的按钮复位到幸福点击一次。见下面类:
public abstract class OneClickListener implements View.OnClickListener {
private boolean clickable = true;
private Runnable reactivateButtonRunnable;
@Override
public final void onClick(final View v) {
if (clickable) {
clickable = false;
reactivateButtonRunnable = new Runnable() {
@Override
public void run() {
reset();
}
};
onOneClick(v, reactivateButtonRunnable);
}
}
public abstract void onOneClick(View v, final Runnable reactivateButtonRunnable);
// reset listener to accept new clicks
public void reset() {
clickable = true;
}
}
例如伪代码,只是为了显示原理:
Button button = new Button(this);
button.setOnClickListener(new OneClickListener() {
@Override
public void onOneClick(View v, Runnable reactivateButtonRunnable) {
launchWebService(reactivateButtonRunnable);
}
});
public void launchWebService(final Runnable reactivateButton){
//
doRequest(new OnResponseListener(){
@Override
public void onSuccess(){
// your custom code
reactivateButton.run(); // makes button clickable again here
}
@Override
public void onTimeout(){
// your custom code
reactivateButton.run(); // makes button clickable again here
}
@Override
public void onFailure(){
// your custom code
reactivateButton.run(); // makes button clickable again here
}
});
}
注:这并不妨碍Android的从你的按钮排队点击事件,但可以防止你的代码执行。
如果您还想禁用按钮,看到Dalmas'的答案,并且融入这个代码,其中可点击变量的变化值....
LadaRaider,这个作品真的很好。这很简单,只是简单的作品。谢谢! – EpicOfChaos 2011-12-16 04:11:10