Android计时器:postDelayed与计划

Jac*_*ckd 4 android timer

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

更新的问题:

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

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

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

谢谢.一些例子......

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

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

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

timer.schedule( new aclass(), 0, 200);
Run Code Online (Sandbox Code Playgroud)

处理方式(来自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);
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 6

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

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

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

Handler,TimerScheduledExecutorService使用类似的方法来安排任务.从一种实现切换到另一种实现时,我不确定您是否可以在精度或性能方面做出重大改变.

更新:最后,我建议你选择一个计时器:

  1. 使用ScheduledExecutorService如果你需要一个任务在一个单独的线程或/和运行任务是主线程太重.
  2. 使用Handler,如果你需要它的消息队列功能的主线程上运行的任务或.
  3. 不要使用Timer,请ScheduledExecutorService改用.