замедление способности пользователя нажимать пюре в Android - PullRequest
1 голос
/ 16 марта 2012

У меня есть действие, которое запускает некоторый контроль 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);
}

Кажется, все работает нормально (и может помочь кому-то, кто испытывает те же трудности), но я открыт для предложений.

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Простой способ предотвратить слишком частое нажатие кнопки пользователем - сохранить время нажатия кнопки, а затем в следующий раз сравнить последнее время с текущим временем, а если разница слишком мала, игнорировать действие.

final static long minTimeBetweenClicks = 1000;

long lastTime;
onClick(View v){
if( System.currentTimeMillis() < lastTime + minTimeBetweenClicks ) return;
//Handle the click
lastTime = System.currentTimeMillis();
}

Прелесть этого в том, что для него не нужны никакие новые потоки или таймеры, и ваши AsyncTasks не должны будут знать о кнопках.

0 голосов
/ 16 марта 2012

Отключить Button после щелчка (setEnabled(false), возможно, в onPreExecute, и включить после выполнения задачи, в onPostExecute.

Также обязательно обратите внимание на изменения жизненного цикла. Ваш AsyncTask может быть убит, если Activity приостановлен, поэтому обязательно проверьте состояние в onResume.

...