Android上的TimerTask如何管理线程?

时间:2013-06-13 10:59:05

标签: android multithreading

我想知道TimerTask如何处理线程。

例如,我有一个执行TimerTask的代码,它有一个'run'方法,可以在UI Thread上运行。

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线程和应用程序不会回应。

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

那么,这里发生了什么?

1 个答案:

答案 0 :(得分:2)

关于您的问题:

    来自docs的
  • 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,请参阅example here它将在UI线程延迟后执行。