runOnUiThread vs Looper.getMainLooper()。在Android中发布

时间:2012-12-20 14:46:20

标签: android android-ui

有人能告诉我使用runOnUiThread()与Looper.getMainLooper()。post()在Android上的UI线程上执行任务之间是否有任何区别?

关于我唯一可以确定的是,因为runOnUiThread是一个非静态的Activity方法,所以当你需要在一个看不到Activity的类中编写代码时,Looper.getMainLooper()。post()会更方便(例如界面)。

我不是在寻找关于是否应该在UI线程上执行某些事情的讨论,我知道有些事情不可能并且很多事情不应该,但有些事情(比如启动AsyncTask)必须从UI线程执行。

谢谢,
R上。

1 个答案:

答案 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已经正确构造并且在执行代码之前具有布局。