提问者:小点点

android中的定时器类还是Handler定时器?[重复]


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

我尝试了两种方式,我知道他们可以做不同的事情,但我不知道为什么,例如使用android计时器类,我无法更新视图,我认为这是一个巨大的限制,但使用处理程序,代码感觉很乱。

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

}

那么,每秒钟做一个动作最好是什么?

编辑:这不是一个重复,因为我询问有关使用计时器更新视图。


共3个答案

匿名用户

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);

匿名用户

根据这个答案:Android-Timertask或Handler,你对TimerTask类不能更新视图(不能更新UI线程)是对的。绝对选择处理程序。老实说,语法看起来很干净。

匿名用户

根据我的经验,Handler和相应的Android帮助类HandlerThread非常灵活,允许您在多线程方面做任何需要的事情。

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.
}