2012-03-16 11 views
1

私はリモートデバイスへのネットワークポート経由でASCII制御を実行するアクティビティを持っています。 インターフェイスを1回押すごとに、AsyncTaskがトリガされ、通信が処理され、(ついに)素晴らしい結果が得られます。 しかし、ユーザーがクラップのチンパンジーのようなボタンマッシュを開始した場合、同じソケット上でコールが多すぎるとシステムがクラッシュするため、少しのタイマー機能を試して反応を遅らせます。ユーザーがAndroidでボタンマッシュを行う速度を遅くする

私は誰かがこれを行うためのより良い方法を思い付いたのだろうか?

の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); 
} 

それは、うまく動作しているようだ(と誰かが同じ難易度を持つ助けるかもしれません)しかし、私は提案に開放されています。

答えて

3

ユーザーがボタンを押しすぎないようにする簡単な方法は、ボタンが押された時刻を保存し、次回の時刻と現在時刻を比較し、その差が小さすぎる場合は無視します。アクション。

final static long minTimeBetweenClicks = 1000; 

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

これの美しさは、それが任意の新しいスレッドやタイマーを必要とせず、あなたのAsyncTasksボタンについて知っている必要はないということです。

+0

私はその吸盤を投票するだろうが、私はrepのポイントがありません。 ありがとう!それを釘付けにする。 – Octoth0rpe

0

クリック後(setEnabled(false)、onPreExecuteButtonを無効にし、タスクが完了したらonPostExecuteで有効にします。

また、ライフサイクルの変更にも注意してください。 Activityが一時停止している場合はAsyncTaskが死亡する可能性がありますので、状態を確認するにはonResumeにしてください。

+0

インターフェイスにはたくさんのボタンがあり、幸せな小さな指で画面全体にジグザグやジグザグが付いている可能性があります。 このような単純なタイマーを使用して、onClickListenersの_any_にチェックを投げると、AsyncTask内のボタンの有効/無効状態をトラッキングする必要はありません。そして、私は、フードの下でフリークアウトを処理しながら、インターフェイスが動作しているとユーザーが信じ続けることを許可したい。 – Octoth0rpe

+0

あなたのタイマー方法は私を混乱させる。通常は、進行中の作業を示すプログレスバーまたはスピナーが表示されます。タスクが実行されている間に、ボタンのテキストを「読み込み中...」に動的に変更することもできます。私は、ボタンの状態を「追跡する」ことが難しいとは確信していません。 (例えば 'isEnabled()') –

+0

その混乱は表面上意味をなさないが、現実はバックグラウンドプロセスが速く起こっていることである。人間がプログレスバーやスピナーを表示しようとする試みを見ることができないということはないAsyncTaskを実行するために必要な分割秒分です。 これは真剣に約300〜600ミリ秒です。貧弱な人間の脳が反応するのは速すぎるが、あまりにも速く、その息子のチンパンジー指がその間にボタン上のキツツキのようにハンマーになる。 – Octoth0rpe