有人能告诉我使用runOnUiThread()与Looper.getMainLooper()。post()在Android上的UI线程上执行任务之间是否有任何区别?
关于我唯一可以确定的是,因为runOnUiThread是一个非静态的Activity方法,所以当你需要在一个看不到Activity的类中编写代码时,Looper.getMainLooper()。post()会更方便(例如界面)。
我不是在寻找关于是否应该在UI线程上执行某些事情的讨论,我知道有些事情不可能并且很多事情不应该,但有些事情(比如启动AsyncTask)必须从UI线程执行。
谢谢,
R上。
答案 0 :(得分:176)
从后台线程调用时,以下行为相同:
使用Looper.getMainLooper()
Runnable task = getTask();
new Handler(Looper.getMainLooper()).post(task);
使用Activity#runOnUiThread()
Runnable task = getTask();
runOnUiThread(task);
唯一的区别是你从UI线程那样做
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
将检查当前Thread是否已经是UI线程,然后直接执行它。将其作为消息发布将延迟执行,直到从当前UI线程方法返回。
还有第三种方法在UI线程上执行Runnable
View#post(Runnable)
- 即使从UI线程调用,也会发布消息。这很有用,因为这样可以确保View
已经正确构造并且在执行代码之前具有布局。