【问题标题】:runOnUiThread vs Looper.getMainLooper().post in AndroidAndroid 中的 runOnUiThread 与 Looper.getMainLooper().post
【发布时间】:2012-12-20 14:46:19
【问题描述】:

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

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

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

【问题讨论】:

  • 除了runOnUiThread会检查它是否已经是UI线程并直接执行你的任务而不是将其发布为Message之外没有区别
  • 谢谢。能否请您将其转换为答案,以便我接受?
  • 另外,我已经编写了一些代码来检查 UI 线程上是否正在执行某些内容,因此手动包含非常简单。

标签: android


【解决方案1】:

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

  • 使用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 已正确构造并在代码执行之前具有布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多