何时使用 handler.post()以及何时使用 new Thread()

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

在 Handler 的开发人员文档中提到:

导致将 Runnable r 添加到消息队列 将在此处理程序所附加的线程上运行。

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

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

那么 runnable 将在一个单独的线程中调用还是在 Activity 的线程中调用?

89140 次浏览

无论何时您想在 UI 线程上执行操作,都应该使用 Handler.post()

假设您想在回调中更改 TextView的文本。因为回调不在 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();

当然,如果您要执行的任务非常长,并且存在用户可能在此期间切换到其他应用程序的风险,那么您应该考虑使用 服务

例如:

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 方法到底是做什么的?

回答你一个具体的问题:

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

Handler Handler = new Handler () hander.post (runnable) ; 然后,runnable 将在一个单独的线程或活动的线程中调用?

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

使用 handler.post()时,你要 邮寄的代码 (通常来自后台线程)主线。是的,邮政,就像你一样,邮寄一封信给某人。在 联络人的帮助下,代码将尽快执行,也就是几乎立即执行。