Android中的计时器类或处理程序计时器?

时间:2019-02-16 10:15:27

标签: java android

Android计时器类与使用Handler创建计时器类有什么区别?

我尝试了两种方式,但我知道它们可以做不同的事情,但是我不知道为什么,例如,使用android定时器类,我无法更新视图,并且我认为这是一个很大的限制,但是对于处理程序,代码感到混乱。 / p>

   Handler handler = new Handler();
   handler.postDelayed(new Runnable() {
       public void run() {
           //actions
       }
   }, 2000);   

}

那么,每两秒钟最好做一次什么?

编辑:这不是重复的,因为我询问如何使用计时器更新视图。

3 个答案:

答案 0 :(得分:2)

android.os.Handler是Android框架的一部分,如果您在UI或主线程中创建了Handler,则该作业将在UI或主线程中执行。请注意,在Android中,您只能从UI线程更新视图。

另一方面,

java.util.Timer将在另一个线程上执行,因此它无法更新视图。

因此,这里推荐使用Handler。如果您确实要使用Timer,则必须使用runOnUiThread,例如:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //this will run on UI thread so you can update views here
            }
        });
    }
}, 2000, 2000);

答案 1 :(得分:1)

根据以下答案:Android - Timertask or Handler ,您对TimerTask类无法更新视图(无法更新 UI线程)是正确的。 绝对选择 Handler 。老实说,语法看起来很干净。

答案 2 :(得分:1)

根据我的经验,Handler和相应的Android帮助器类HandlerThread非常灵活,可以让您做有关多线程的几乎任何事情。

例如,在UI线程上运行代码:

Handler mUIHandler = new Handler(Looper.getMainLooper());
mUIHandler.post(new Runnable() {
    /* Do something on UI-Thread */
});

在后台线程上工作:

// This thread still needs to be explicitly started somewhere
HandlerThread mBackgroundThread = new HandlerThread("ThreadName");
// Sometimes you still need to think about some synchronization before calling getLooper()
Handler mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
// Execute code on the background thread the same way you would on the UI-Thread

在给定间隔后重复执行特定任务:

Runnable mTask = new Runnable() {
    // Run this task (every 1000 ms) on the thread associated with mHandler
    mHandler.postDelayed(this, 1000);

    /* Perform the Task */

    // You can also do this at the end if you wanted it to repeat 1000 ms AFTER
    // this task finishes.
}