Android计时器类和使用Handler创建计时器类有什么区别?
我尝试了两种方式,我知道他们可以做不同的事情,但我不知道为什么,例如使用android计时器类,我无法更新视图,我认为这是一个巨大的限制,但使用处理程序,代码感觉很乱。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
//actions
}
}, 2000);
}
那么,每秒钟做一个动作最好是什么?
编辑:这不是一个重复,因为我询问有关使用计时器更新视图。
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);
根据这个答案:Android-Timertask或Handler,你对TimerTask类不能更新视图(不能更新UI线程)是对的。绝对选择处理程序。老实说,语法看起来很干净。
根据我的经验,Handler
和相应的Android帮助类HandlerThread
非常灵活,允许您在多线程方面做任何需要的事情。
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.
}