2017-05-15 9 views
0

複数のプログレスバーがある画面があります。私は同時にそれらをすべて定期的に実行しようとしています。Android - 複数の定期的なハンドラを同時に実行する方法

私はもともと(ハンドラはUIスレッド上で実行されます)ので、同様にこれをしなかった:

// Timers and Handlers for each of the 45 progressbars on screen. 
private Timer[] timer = new Timer[45]; 
private Handler[] handler = new Handler[45]; 
private boolean endTimers = false; 
private Handler handlerHolder; 
private int idx; 
private void initTimers(){ 
    for(int i=0;i<timer.length;i++){ 
     idx = i; 
     handlerHolder = handler[i] 
     timer[i] = new Timer(); 
     handler[i] = new Handler(); 
     final int finalI = i; 
     timer[i].scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       handler[finalI].post(new Runnable() { 
        @Override 
        public void run() { 
         if (endTimers){ 
          return; 
         } 
         timerEvent(finalI); 
        } 
       }); 
      } 
     }, 0, 100); 
    } 
} 

これは動作しますが、しかし、私は時々、その進捗バーのグリッチを見つけることだ、と私はにTimerTasksは、問題の多くを持っていることを読みますアンドロイドでコードをハンドラでのみ書き直そうとしましたが、forループの最初のインデックスに無限ループが発生します。上記timer[i].scheduleAtFixedRateブロックは、私が書く代わりに

private Runnable actionRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (endTimers){ 
      return; 
     } 
     timerEvent(idx); 
     handlerHolder.postDelayed(actionRunnable, 100); 
    } 
}; 

その後

私の試み

handler[i].postDelayed(actionRunnable, 100); 

私は、これは無限ループを作成する理由を理解...しかし、私はわからないんだけど何私はこのハンドラを実行したままにしておくべきですが、私がやった元のやり方のようにfor-loopを続けるべきです。

私はhandlerArray内のすべてのハンドラが同時にすべてを定期的に実行したいと思っています。アドバイスをいただければ幸いです。

+0

ハンドラはスレッド間の通信を目的としているため、ハンドラだけでコードを記述するのは意味がありませんが、スレッドは追加されません。 –

+0

[mcve]と記入してください。関連するすべての変数宣言と初期化を提供する必要があります。 –

+0

@ Code-Apprenticeコードと詳細を追加しました。私の質問がはっきりしているかどうか教えてください。ありがとう! – tash

答えて

0

Handler.post()は、ハンドラを作成したスレッドで、指定されたRunnableを実行します。あなたはおそらくすべてのハンドラをUIスレッド上に作成しています。これは、コードを直接実行することと同じです。時間のかかる作業のためにスレッドを作成する必要があります。スレッドでこれを直接行うことも、AsyncTaskを拡張することもできます。後者が好ましい。

関連する問題