gpt4 book ai didi

android - Android 中的 runOnUiThread 与 Looper.getMainLooper().post

转载 作者:IT老高 更新时间:2023-10-28 13:06:58 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于android - Android 中的 runOnUiThread 与 Looper.getMainLooper().post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13974661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com