我有一个包含多个进度条的屏幕。我试图同时定期运行它们。
我最初是这样做的(处理程序在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有很多关于android的问题。我试图仅使用处理程序重写我的代码,但它只会导致for循环中第一个索引的无限循环。
我的尝试
private Runnable actionRunnable = new Runnable() {
@Override
public void run() {
if (endTimers){
return;
}
timerEvent(idx);
handlerHolder.postDelayed(actionRunnable, 100);
}
};
然后我写了
而不是上面的timer[i].scheduleAtFixedRate
块
handler[i].postDelayed(actionRunnable, 100);
我理解为什么这会创建一个无限循环......但是我不确定我应该做什么让这个处理程序继续运行,但继续使用for循环,就像我原来的方式一样。
我希望handlerArray中的所有处理程序能够定期运行,所有这些都在同一时间。任何意见是极大的赞赏。
答案 0 :(得分:0)
Handler.post()
在创建Handler的线程上执行给定的Runnable。您可能正在UI线程上创建所有处理程序。这与直接运行代码没什么不同。您需要为耗时的任务创建线程。您可以直接使用Threads执行此操作,也可以扩展AsyncTask。后者更可取。