我在那裏當我按下一個按鈕,它與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