114

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

我唯一能确定的是,由于 runOnUiThread 是一个非静态的 Activity 方法,Looper.getMainLooper().post()当你需要在一个看不到 Activity 的类(例如接口)中编写一些东西时会更方便。

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

4

1 回答 1

208

从后台线程调用时,以下行为相同:

  • 使用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 线程方法返回。

还有第三种Runnable在 UI 线程上执行的方法是View#post(Runnable)- 即使从 UI 线程调用,这种方法也将始终发布消息。这很有用,因为这将确保View在执行代码之前已正确构造并具有布局。

于 2012-12-20T15:00:51.807 回答