我有一个活动,通过网络端口对远程设备运行一些ASCII控制。 按下界面上的每一个按钮都会触发AsyncTask来处理通信,并且(最终)工作得很好。 但是,如果用户在破解时像黑猩猩一样开始按钮捣碎,系统会因同一个插槽上的太多调用而崩溃,所以我想出了一个小的计时器功能来减缓对他们兴奋的反应。
我想知道是否有人想出更好的方法来做到这一点?
首先,在onCreate内部:
btn_pwrtoggle = (Button)findViewById(R.id.pwr_btn);
btn_pwrtoggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!buttonMasher){
if(powerstat.equals("OFF")){
String[] commandToSend = {"POWER","ON"}
}else{
String[] commandToSend = {"POWER","OFF"};
}
deviceControl(commandToSend);
}
startButtonMashTimer();
}else{
Log.w("button masher","slow down there, monkey.");
}
}
});
然后,在实际的Activity中:
Timer buttonTimer;
TimerTask buttonMonitorThread;
int chimpCrackCounter;
protected void startButtonMashTimer() {
chimpCrackCounter = 0;
buttonTimer = new Timer();
buttonMonitorThread = new TimerTask(){
@Override
public void run(){
buttonMasher = true;
if(chimpCrackCounter == 1){
buttonMasher = false;
buttonTimer.cancel();
}
chimpCrackCounter++;
}
};
buttonTimer.schedule(buttonMonitorThread, 0, 500);
}
似乎工作得很好,(可能会帮助有同样困难的人),但我愿意接受建议。
答案 0 :(得分:3)
防止用户经常按下按钮的简单方法是节省按下按钮的时间,然后下次将上次与当前时间进行比较,如果差异太小,则忽略该操作
final static long minTimeBetweenClicks = 1000;
long lastTime;
onClick(View v){
if( System.currentTimeMillis() < lastTime + minTimeBetweenClicks ) return;
//Handle the click
lastTime = System.currentTimeMillis();
}
这样做的好处是它不需要任何新线程或定时器,并且您的AsyncTasks不必知道按钮。
答案 1 :(得分:0)
点击Button
之后setEnabled(false
(onPreExecute
),可能在onPostExecute
中,并在任务完成后启用,AsyncTask
。
另外,请务必注意生命周期的变化。如果暂停Activity
,您的onResume
可能会被杀死,因此请务必检查{{1}}中的状态。