72

我想知道什么时候应该使用handler.post(runnable);,什么时候应该使用 new Thread(runnable).start();

它在 Handler 的开发者文档中提到:

使 Runnable r 添加到消息队列中。可运行对象将在附加此处理程序的线程上运行。

这是否意味着如果我在onCreate()课堂上Activity写:

Handler handler = new Handler();
handler.post(runnable);

那么runnable会在单独的线程中调用还是在Activity的线程中调用呢?

4

4 回答 4

102

Handler.post()每当您想在 UI 线程上执行操作时都应该使用。

因此,假设您想更改TextView回调中的 a 文本。因为回调不在 UI 线程上运行,所以您应该使用Handler.post().

在 Android 中,与许多其他 UI 框架一样,UI 元素(小部件)只能从 UI 线程修改。

另请注意,术语“UI 线程”和“主线程”通常可以互换使用。


编辑:长时间运行任务的示例:

mHandler = new Handler();

new Thread(new Runnable() {
  @Override
  public void run () {
    // Perform long-running task here
    // (like audio buffering).
    // You may want to update a progress
    // bar every second, so use a handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on the UI - for example
       // on a progress bar.
     }
    });
  }
}).start();

当然,如果您要执行的任务真的很长,并且用户可能会同时切换到另一个应用程序的风险,您应该考虑使用Service

于 2013-02-28T13:02:34.773 回答
35

要回答您的具体问题:

这是否意味着如果在 Activity 类的 onCreate 中我写:

处理程序 handler = new Handler() hanlder.post(runnable); 那么,runnable 会在单独的线程中调用还是在 Activity 的线程中调用?

不,不会的。Runnable 将在主线程本身上调用。处理程序仅用于将消息发布到它所附加的线程(创建它的位置)。它不会自行创建线程。在您的示例中,您在主线程(调用 Activity.OnCreate() 的位置)中创建了一个处理程序,因此在此类处理程序上发布的任何消息都将仅在主线程上运行。

于 2014-03-07T07:54:26.250 回答
12

示例被顶起:

mHandler = new Handler();
new Thread(new Runnable(){
  @Override
  public void run () {
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

或者,您可以跳过处理程序并直接在视图上使用 post 方法:

new Thread(new Runnable(){
  @Override
  public void run () {
    mUiView.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

这是一篇很好的文章,概述了不同之处:post 方法到底是做什么的?

于 2014-01-24T15:02:08.470 回答
7

handler.post()当您想将代码(通常从后台线程)发布主线程时使用。是的,POST,就像你一样,给某人寄一封信。在处理程序的帮助下,代码将尽快执行,即几乎立即执行。

于 2017-03-27T00:14:57.610 回答