Timertask或Handler

时间:2013-12-02 14:13:30

标签: android performance timer handler timertask

假设我想每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);

如果您能解释何时使用哪种方法以及为什么其中一种方法比另一种方法更有效(如果确实如此),我将不胜感激。

3 个答案:

答案 0 :(得分:73)

Handler优于TimerTask

Java TimerTask和Android Handler都允许您在后台线程上安排延迟和重复的任务。但是,大多数文献建议在Android中使用Handler而不是TimerTask(请参阅herehereherehere,{{3} }和here)。

TimerTask报告的一些问题包括:

  • 无法更新UI线程
  • 内存泄漏
  • 不可靠(并不总是有效)
  • 长时间运行的任务可能会干扰下一个预定的事件

示例

我见过的各种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

有一些缺点      

它只创建一个线程来执行任务,如果任务需要   运行太久,其他任务受到影响。它不处理异常   任务和线程抛出的只是终止,这会影响其他   预定的任务,他们永远不会运行

复制自:

TimerTask vs Thread.sleep vs Handler postDelayed - most accurate to call function every N milliseconds?

答案 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)