我想知道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。
那么,这里发生了什么?
答案 0 :(得分:2)
关于您的问题:
runOnUiThread
:
在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则该操作将发布到UI线程的事件队列中。
TimerTask中的代码在不同的线程上执行,因此您应该调用runOnUiThread
来执行代码。
您做得对,但为什么要在run方法中重新创建timertask?考虑使用scheduleAtFixedTime
,100将是句点,延迟0。
然后run方法将执行它应该执行的任务。
runOnUiThread(new Runnable() {
@Override
public void run() {
//do whatever
}
});
<强> *更新:强>
如果对视图进行更新,最好使用handler.postDelayed
,请参阅example here它将在UI线程延迟后执行。