安卓定时器:postDelayed vs.时间表



我需要每200毫秒完成一次工作,而且我需要它平滑、均匀。要做的任务是中等重量的(在这两种情况下,问题1和2)。从社区中搜索计时器似乎是最好的解决方案,那就是使用一个处理程序,一个可运行的和postDelayed(),(如何在android中设置计时器?)。

更新的问题:

-如果我必须与UI交互,postDelayed()还是schedule()/scheduleAtFixedRate(),哪种方式最精确、最快速?

-如果我不必与UI交互,postDelayed()schedule()/scheduleAtFixedRate(),哪种方式最精确、最快速?

-这两种方式可以在主进程上执行,也可以在单独的进程上执行?怎样

这样我就有了主类的本地对象,但它是一个新线程吗?这是一个好的做法吗?

timer.schedule( new TimerTask() {           
        @Override
        public void run() {
                    textview.setText(str);
                    //other stuff            
                                     }
            }, 0, 200);

下一个是另一个有时间表的任务,任务在一个单独的任务中,而不是定时器本身,我想我不能直接与UI交互,我想。。。

timer.schedule( new aclass(), 0, 200);

处理方式(来自Dave.B):

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        TextView.setText(str);
        // other stuff
        timerHandler.postDelayed(this, 500); }
};
@Override
public void onCreate(Bundle savedInstanceState) {
...
timerHandler.postDelayed(timerRunnable, 0);
}

Timer在一个单独的线程上执行其任务,该线程仅用于为该特定计时器创建的任务提供服务。Handler在其Looper的线程上运行其任务,该线程可以是UI线程,也可以不是UI线程。一般来说,如果在单独的线程上使用Handler,这两个类之间没有太大区别。但在安卓系统中,使用HandlerHandlerThread更为常见。

如果您需要与UI交互,最好在主线程上使用Handler,以避免上下文切换。但在这种情况下,可能会有一些延迟,因为这种定时器的性能将取决于UI的整体性能。

UPDATE:在第三个示例中,Runnable在主线程上执行。我假设这个例子中的所有代码都位于Activity子类中。

HandlerTimerScheduledExecutorService使用类似的方法来调度任务。当从一个实现切换到另一个实现时,我不确定您是否能在精度或性能方面得到重大更改。

UPDATE:最后,我建议您使用以下方法来选择计时器:

  1. 如果需要在单独的线程上运行任务,或者/并且任务对于主线程来说太重,请使用ScheduledExecutorService
  2. 在主线程上运行任务或需要其消息队列功能时,请使用Handler
  3. 不要使用Timer,而是使用ScheduledExecutorService

我宁愿使用ScheduledThreadPoolExecutor,因为计时器按顺序运行任务,所以如果一次有多个任务,剩余的任务将被延迟。而ScheduledThreadPoolExecutor具有线程池&它允许多个任务并行运行,因此不会出现延迟。

Handler postdelayed方法用于将您的可运行程序发布到Android中的主UI线程,您需要它来做所有与UI相关的事情。不要混淆计时器和延迟的处理程序

编辑1:对于与UI相关的东西,您可以使用postdelayed处理程序。例如

handler.postDelayed(new Runnable() {
        public void run() {
          textview.setText(str);
          //other UI related stuff      
        }
    }, 200);

最新更新