我想知道何时应该使用handler.post(runnable);
以及何时应该使用new Thread(runnable).start();
onCreate()
在Handler的开发人员文档中提到:
使Runnable r添加到消息队列中。可运行的 将在此处理程序所附加的线程上运行。
这是否意味着如果我在Activity
类的Handler handler = new Handler();
handler.post(runnable);
中写道:
{{1}}
那么runnable将在一个单独的线程中调用,还是在Activity的线程中调用?
答案 0 :(得分:79)
只要您想在UI线程中执行操作,就应该使用Handler.post()
。
所以,让我们说回调(在单独的线程中运行)你要更改TextView
的文本,你应该使用Handler.post()
。
在Android中,与许多其他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 some progress
// bar every second, so use handler:
mHandler.post(new Runnable() {
@Override
public void run () {
// make operation on UI - on example
// on progress bar.
}
});
}
}).start();
当然,如果您要执行的任务非常长并且用户可能在此期间切换到其他应用程序的风险,则应考虑使用Service。
答案 1 :(得分:24)
回答你的具体问题:
这是否意味着如果在我写的onCreate of Activity类中:
Handler handler = new Handler()hanlder.post(runnable);然后,可以运行 将在一个单独的线程中调用还是在Activity的线程中调用?
不,不会。 Runnable将在主线程本身上调用。 Handler仅用于将消息发布到它所附加的线程(创建它的位置)。 它不会自己创建一个线程。 在您的示例中,您在主线程中创建了一个处理程序(调用了Activity.OnCreate()),因此在此类处理程序上发布的任何消息都将仅在主线程上运行。
答案 2 :(得分:11)
举例:
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();
这篇文章概述了差异:What exactly does the post method do?
答案 3 :(得分:4)
如果您希望发布代码(通常来自后台线程)到主线程,请使用handler.post()
。是的,POST,就像你一样,给某人发一封信。在处理程序的帮助下,代码将尽快执行,即几乎立即执行。