Android计时器类与使用Handler创建计时器类有什么区别?
我尝试了两种方式,但我知道它们可以做不同的事情,但是我不知道为什么,例如,使用android定时器类,我无法更新视图,并且我认为这是一个很大的限制,但是对于处理程序,代码感到混乱。 / p>
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
//actions
}
}, 2000);
}
那么,每两秒钟最好做一次什么?
编辑:这不是重复的,因为我询问如何使用计时器更新视图。
答案 0 :(得分:2)
android.os.Handler
是Android框架的一部分,如果您在UI或主线程中创建了Handler,则该作业将在UI或主线程中执行。请注意,在Android中,您只能从UI线程更新视图。
java.util.Timer
将在另一个线程上执行,因此它无法更新视图。
因此,这里推荐使用Handler。如果您确实要使用Timer,则必须使用runOnUiThread
,例如:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//this will run on UI thread so you can update views here
}
});
}
}, 2000, 2000);
答案 1 :(得分:1)
根据以下答案:Android - Timertask or Handler ,您对TimerTask类无法更新视图(无法更新 UI线程)是正确的。 绝对选择 Handler 。老实说,语法看起来很干净。
答案 2 :(得分:1)
根据我的经验,Handler
和相应的Android帮助器类HandlerThread
非常灵活,可以让您做有关多线程的几乎任何事情。
例如,在UI线程上运行代码:
Handler mUIHandler = new Handler(Looper.getMainLooper());
mUIHandler.post(new Runnable() {
/* Do something on UI-Thread */
});
在后台线程上工作:
// This thread still needs to be explicitly started somewhere
HandlerThread mBackgroundThread = new HandlerThread("ThreadName");
// Sometimes you still need to think about some synchronization before calling getLooper()
Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
// Execute code on the background thread the same way you would on the UI-Thread
在给定间隔后重复执行特定任务:
Runnable mTask = new Runnable() {
// Run this task (every 1000 ms) on the thread associated with mHandler
mHandler.postDelayed(this, 1000);
/* Perform the Task */
// You can also do this at the end if you wanted it to repeat 1000 ms AFTER
// this task finishes.
}