Android计时器:postDelayed与计划

时间:2014-09-12 02:05:14

标签: android timer

请不要暂停,请不要将其标记为重复,请回答我! 我需要每200毫秒完成一些东西,我需要它平滑而均匀。要做的任务是中等重量(在两种情况下,问题1和2)。 搜索计时器看起来像社区的最佳解决方案是使用处理程序,runnable和postDelayed(),(Android timer? How-to?)。

更新了问题:

- 如果我必须与UI,postDelayed()或schedule()/ scheduleAtFixedRate()进行交互,那么哪种方式最准确,最快?

- 如果我不需要与UI,postDelayed()或schedule()/ scheduleAtFixedRate()进行交互,那么哪种方式最精确,最快?

- 可以在主进程或单独的进程上执行两种方式吗?怎么样?

感谢。 一些例子......

这样我有mainclass本地对象,但是它是一个新线程吗?这是一个很好的实践吗?

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

下一个是另一个有计划,任务是在一个单独的任务,而不是计时器本身,我猜,我不能直接与UI交互,我猜......

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

Handler方式(来自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);
}

2 个答案:

答案 0 :(得分:6)

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

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

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

HandlerTimerScheduledExecutorService使用类似的方法来安排任务。从一种实现切换到另一种实现时,我不确定您是否可以在精度或性能方面进行重大更改。

更新:最后,我建议您选择以下方法:

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

答案 1 :(得分:1)

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

处理程序后延迟方法是将您的runnable发布到Android中的主UI线程,您需要它来执行所有与UI相关的内容。不要将计时器与Handler postdelayed混淆

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

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