Android - 如何同时运行多个定期处理程序

时间:2017-05-15 00:00:55

标签: java android timer

我有一个包含多个进度条的屏幕。我试图同时定期运行它们。

我最初是这样做的(处理程序在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中的所有处理程序能够定期运行,所有这些都在同一时间。任何意见是极大的赞赏。

1 个答案:

答案 0 :(得分:0)

Handler.post()在创建Handler的线程上执行给定的Runnable。您可能正在UI线程上创建所有处理程序。这与直接运行代码没什么不同。您需要为耗时的任务创建线程。您可以直接使用Threads执行此操作,也可以扩展AsyncTask。后者更可取。