降低用户在Android中按下mash的能力

时间:2012-03-16 14:19:18

标签: android performance onclicklistener

我有一个活动,通过网络端口对远程设备运行一些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);
}

似乎工作得很好,(可能会帮助有同样困难的人),但我愿意接受建议。

2 个答案:

答案 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(falseonPreExecute),可能在onPostExecute中,并在任务完成后启用,AsyncTask

另外,请务必注意生命周期的变化。如果暂停Activity,您的onResume可能会被杀死,因此请务必检查{{1}}中的状态。