假设我想每10秒执行一次操作,并不一定需要更新视图。
问题是:使用带有timertask的计时器是否更好(我的意思是更有效率和更有效):
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
或只是一个带有postdelayed的处理程序
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
如果您能解释何时使用哪种方法以及为什么其中一种方法比另一种方法更有效(如果确实如此),我将不胜感激。
答案 0 :(得分:73)
Handler
优于TimerTask
。
Java TimerTask
和Android Handler
都允许您在后台线程上安排延迟和重复的任务。但是,大多数文献建议在Android中使用Handler
而不是TimerTask
(请参阅here,here,here,here,{{3} }和here)。
TimerTask报告的一些问题包括:
示例强>
我见过的各种Android示例的最佳来源是here。这是一个Handler
示例,用于重复任务。
// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
@Override
public void run() {
// Do something here on the main thread
Log.d("Handlers", "Called on main thread");
// Repeat this the same runnable code block again another 2 seconds
handler.postDelayed(runnableCode, 2000);
}
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
相关强>
答案 1 :(得分:17)
使用Timer
有一些缺点它只创建一个线程来执行任务,如果任务需要 运行太久,其他任务受到影响。它不处理异常 任务和线程抛出的只是终止,这会影响其他 预定的任务,他们永远不会运行
复制自:
答案 2 :(得分:0)
接受的答案的Kotlin版本:
val handler = Handler()
val runnableCode = object : Runnable {
override fun run() {
Log.d("Handlers", "Called on main thread")
handler.postDelayed(this, 2000)
}
}
handler.post(runnableCode)