2016-08-16 1 views
0

私のアンドロイドアプリでは、覚えておいて、ユーザーが繰り返し押す一連のボタンを表示しようとしています。これを行うには、UIを変更するためにpostDelayメソッドでrunnablesを使用しています。現在、順番にすべてのボタンが同じ瞬間に表示されており、すべて同じ瞬間に隠れています。誰かが走り回りを同期させて、一緒にではなく次々に見せてくれるのを助けてくれますか?コードを以下に示します。ランナブルを次々に開始するように同期するには?

for(int i = 0; i < generatedSequenceToPlay.size(); i++){ 
     final int position = i; 
     _handler.postDelayed(new Runnable() { 
      @Override 
      public synchronized void run() { 
       findButtonById(_defuseButtonHandler.getKeyByValue(generatedSequenceToPlay.get(position).toString())).setPressed(true); 
      } 
     }, 500); 
     _handler.postDelayed(new Runnable() { 
      @Override 
      public synchronized void run() { 
       findButtonById(_defuseButtonHandler.getKeyByValue(generatedSequenceToPlay.get(position).toString())).setPressed(false); 

      } 
     }, 500); 
    } 
+1

増加 'postDelayed'各ループ反復のための最後のパラメータ、例えば:' 500 *(I + 1) ' – pskink

+0

は、いくつかの一般的なオブジェクトで同期を持っています – sidgate

答えて

0

this page.

postDelayedの方法の説明を確認してくださいは、Runnableをrが経過する一定の時間後に を実行するために、メッセージキューに追加されます。実行可能ファイルは、このハンドラがアタッチされているスレッド上で で実行されます。

指定された時間が経過すると、実行可能タスクはメッセージキューから取得され、実行のためにスレッドにアタッチされます。実行可能なすべてのタスクは、各タスクが時間のかかる作業ではないため、はほぼと同時に500ミリ秒後に実行されます。ですから、@ pskinkが示唆するように、それぞれの実行可能なタスクに異なるタイマーがあなたに好意を与えるようにします。

たとえば、次のようなコードを変更できます。

for(int i = 0; i < generatedSequenceToPlay.size(); i++){ 
     final int position = i; 
     _handler.postDelayed(new Runnable() { 
      @Override 
      public synchronized void run() { 
       findButtonById(_defuseButtonHandler.getKeyByValue(generatedSequenceToPlay.get(position).toString())).setPressed(true); 
      } 
     }, 500 + i * 100); 
     _handler.postDelayed(new Runnable() { 
      @Override 
      public synchronized void run() { 
       findButtonById(_defuseButtonHandler.getKeyByValue(generatedSequenceToPlay.get(position).toString())).setPressed(false); 

      } 
     }, 500 + i * 100); 
    } 
関連する問題