gpt4 book ai didi

Android Handler.post,到底发生了什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:37 25 4
gpt4 key购买 nike

几天以来,我试图弄清楚如果我在

中执行代码到底会发生什么
void function(){

//somePreExecutionCode
new Handler().post(new Runnable(){
@Override
public void run(){
//someCode
}
});
}

它似乎并没有阻塞 UI,因此调用 function() 的按钮在 someCode 完成之前不会停留在单击的位置。但是,如果 somePreExecutionCode 启动了一个进度条,则进度条会在 someCode 完成的同一时刻显示。我知道,有 AsyncTasks for,但还有其他可能性吗?

有什么区别
new Handler().post 

View.post

?

最佳答案

创建 Android 应用程序时,系统会创建一个执行主线程。该线程称为 UI 线程,所有与 UI 相关的操作都发生在该线程上,以避免同步问题。

A Looper实例是在这个线程上创建的,它有一个 MessageQueue数据结构。 Looper 将处于无限循环中等待读取 Message。/RunnableMessageQueue 上发布的实例.添加 Message7/Runnable到消息队列,Handler被使用。

当您创建一个 Handler 实例时,它将与当前执行线程和在该特定线程上创建的 Looper 实例相关联。

因此,当您通过 Handler 发布消息时,消息会添加到 MessageQueue 中,Looper 将按 FIFO 顺序读取该消息并将其传递给目标。

new Handler().post() 和 View.post 有点不同。

  • 当您通过 View.post 发布消息时,您可以保证消息将发布到 UI 线程的 MessageQueue 上,因为它在内部使用在 UI 线程上创建的 Handler 实例。
  • 如果您在 UI 线程上创建 Handler 实例并在任何线程上使用它发布消息,消息将被发布到 UI 线程的 MessageQueue。
  • 如果您在非 UI 线程上创建 Handler 实例并使用它发布消息,它们将被发布到非 UI 线程的 MessageQueue 上。

关于Android Handler.post,到底发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22983776/

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