首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >定时器任务或处理程序

定时器任务或处理程序
EN

Stack Overflow用户
提问于 2013-12-02 22:13:30
回答 3查看 71.1K关注 0票数 110

假设我想每10秒执行一次操作,它不一定需要更新视图。

问题是:像这样使用timer和timertask是不是更好(我的意思是更高效和有效):

代码语言:javascript
复制
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);
}

或者只是一个延迟的处理程序

代码语言:javascript
复制
final Handler handler = new Handler(); 
final Runnable r = new Runnable()
{
    public void run() 
    {
        <some task>
    }
};
handler.postDelayed(r, 15000);

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

EN

回答 3

Stack Overflow用户

发布于 2016-10-31 17:38:52

Handler TimerTask**.**比更好

Java TimerTask和Android Handler都允许您在后台线程上调度延迟和重复的任务。然而,文献中压倒性地推荐在安卓系统中使用Handler而不是TimerTask (参见herehereherehereherehere)。

报告的有关TimerTask的一些问题包括:

  • 无法更新UI thread
  • Memory leaks
  • Unreliable (并非始终有效)
  • 长时间运行的任务可能会干扰下一个计划的event

示例

我所见过的各种Android示例的最好来源是Codepath。下面是一个重复任务的Handler示例。

代码语言:javascript
复制
// 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);

与相关的

票数 108
EN

Stack Overflow用户

发布于 2013-12-02 22:19:55

使用定时器有一些缺点

它只创建单个线程来执行任务,如果一个任务运行时间太长,其他任务就会受到影响。它不处理任务引发的异常,线程只是终止,这会影响其他计划任务,并且这些任务永远不会运行

复制自:

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

票数 19
EN

Stack Overflow用户

发布于 2019-06-05 15:03:07

接受答案的Kotlin版本:

代码语言:javascript
复制
// execute on the main thread, empty constructor is deprecated
val handler = Handler(Looper.getMainLooper())

val runnableCode = object : Runnable {
    override fun run() {
        Log.d("Handlers", "Called on main thread")
        handler.postDelayed(this, 2000)
    }
}

// or shorter using a lambda function
val runnableCode = Runnable {
    Log.d("Handlers", "Called on main thread")
    handler.postDelayed(this, 2000)
}

handler.post(runnableCode)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20330355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档