複数のプログレスバーがある画面があります。私は同時にそれらをすべて定期的に実行しようとしています。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内のすべてのハンドラが同時にすべてを定期的に実行したいと思っています。アドバイスをいただければ幸いです。
ハンドラはスレッド間の通信を目的としているため、ハンドラだけでコードを記述するのは意味がありませんが、スレッドは追加されません。 –
[mcve]と記入してください。関連するすべての変数宣言と初期化を提供する必要があります。 –
@ Code-Apprenticeコードと詳細を追加しました。私の質問がはっきりしているかどうか教えてください。ありがとう! – tash