Android中的runOnUiThread vs Looper.getMainLooper()。post


99

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

我唯一能确定的是,由于runOnUiThread是非静态的Activity方法,因此当您需要在无法看到Activity的类中编写某些代码时,Looper.getMainLooper()。post()更方便。接口)。

我不希望在UI线程上执行某些操作的讨论中,我发现有些事情不能执行,很多事情不应该执行,但是某些事情(例如启动AsyncTask)必须从以下位置执行UI线程。

谢谢,
R。


6
没有区别,除了runOnUiThread会检查它是否已经是UI线程并直接执行任务,而不是将其发布为Message
zapl 2012年

1
谢谢。您可以将其转换为答案,以便我接受吗?
Rich

另外,我已经编写了一些代码来检查UI线程是否正在执行某些操作,因此手动添加将非常简单。
Rich

Answers:


191

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

  • 使用 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();
    }
}

将检查当前线程是否已经是UI线程,然后直接执行它。将其作为消息发布会延迟执行,直到您从当前的UI线程方法返回为止。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.