1

我想知道 TimerTask 如何与线程一起工作。

例如,我有一个执行 TimerTask 的代码,它有一个将在 UI 线程上运行的“运行”方法。

class looper extends TimerTask {

    public looper() {

    }

    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                timer.schedule(new looper(), new Date(new Date().getTime() + 100));
            }
        });
    }
}

计时器会像这样开始:

    timer = new Timer();
    timer.schedule(new looper(), new Date());

TimerTask 会创建一个新线程吗?如果是这样,将如何runOnUiThread工作?它会将代码移动到 UI 线程吗?

我试图消除再次调用 TimerTask ( timer.schedule) 的需要,并且只使用内部的无限循环run进行计算 - 但这会阻塞 UI 线程并且应用程序不会响应。

PS - 我必须让代码在 UI 线程上运行,因为它必须更新 UI。

那么,这里发生了什么?

4

1 回答 1

2

关于您的问题:

  • runOnUiThread来自文档:

    在 UI 线程上运行指定的操作。如果当前线程是 UI 线程,则立即执行该操作。如果当前线程不是 UI 线程,则将动作发布到 UI 线程的事件队列中。

  • TimerTask 的代码在不同的线程上执行,所以你应该调用runOnUiThread来执行代码。

你做得对,但你为什么要在 run 方法中重新创建 timertask 呢?考虑使用scheduleAtFixedTime,100 将是周期和延迟 0。然后 run 方法将执行它应该执行的任务。

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //do whatever
        }
    });

scheduleAtFixedTime

*更新:

如果它是对视图的更新,最好使用handler.postDelayed,请参见此处的示例,它将在 UI 线程延迟后执行。

于 2013-06-13T11:23:58.257 回答