У меня есть действие, которое запускает некоторый контроль 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.");
}
}
});
Затем в фактическом действии:
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);
}
Кажется, все работает нормально (и может помочь кому-то, кто испытывает те же трудности), но я открыт для предложений.