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

2024-03-12

几天以来,我试图弄清楚如果我执行代码到底会发生什么

void function(){

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

看起来它并没有阻塞 UI,因此调用 function() 的按钮不会卡在单击的位置,直到 someCode 完成。 但是,如果 somePreExecutionCode 启动进度条,则当 someCode 完成时,进度条会在同一时刻显示。 我知道,有 AsyncTasks,但是还有其他可能性吗?

和有什么区别

new Handler().post 

and

View.post

?


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

A Looper http://developer.android.com/reference/android/os/Looper.html实例是在此线程上创建的,该线程有一个消息队列 http://developer.android.com/reference/android/os/MessageQueue.html数据结构。 Looper会处于无限循环等待读取Message http://developer.android.com/reference/android/os/Message.html / Runnable http://developer.android.com/reference/java/lang/Runnable.html实例发布于消息队列 http://developer.android.com/reference/android/os/MessageQueue.html。添加消息7 /Runnable http://developer.android.com/reference/java/lang/Runnable.html到消息队列,Handler http://developer.android.com/reference/android/os/Handler.html用来。

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

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

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

  • 当您通过 View.post 发布消息时,可以保证消息将发布到 UI 线程消息队列上,因为它内部使用在 UI 线程上创建的 Handler 实例。
  • 如果您在 UI 线程上创建 Handler 实例并在任何线程上使用它发布消息,则消息将被发布到 UI 线程的 MessageQueue 中。
  • 如果您在非 UI 线程上创建 Handler 实例并使用它发布消息,它们将被发布到非 UI 线程的 MessageQueue 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Handler.post,到底发生了什么 的相关文章

  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • 使用 Android 前台服务为 MediaPlayer 创建通知

    问题就在这里 我目前正在开发一个应用程序 该应用程序必须提供 A 广播播放器 来自 URL 的 AAC 直播 还有一个播客播放器 来自 URL 的 MP3 流 该应用程序必须能够在后台运行 Android 服务 并通过以下方式向用户公开持续
  • GCM 向主题发送消息:TOO_MANY_TOPICS 错误

    以前 GCM 每个应用程序有 100 万个主题订阅的限制 我发现他们现在已经取消了这一限制 基于发布 订阅模型 主题消息支持 每个应用程序无限订阅 https developers google com cloud messaging to
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐

  • django-admin 中的模型描述

    django admin中是否可以在某个模型的列表显示页面上放置模型描述或描述 我说的是当你点击 django admin 主页上的模型名称链接并进入该模型的列表显示页面时 表格顶部将写有说明 就像是 该模型用于记录将通过我们的抓取获取的所
  • SVG 容器在 Safari 桌面中呈现错误的大小(在 Chrome/iOS 中正常)

    我以为 Safari 已经解决了这个问题 但它似乎仍然是一个问题 除非我做了一些明显错误的事情 我在对象标签内放置了一个 SVG 它被包裹在一个灵活的包含 DIV 中 例如设置为宽度 50 在调整大小时 容器高度在 Firefox Chro
  • JPMS支持模块版本吗?

    我以为JPMS不支持模块版本 然而 当我这样做时java list modules我有以下输出 java activation 9 java base 9 java compiler 9 java corba 9 java datatran
  • 使用 jenkins 执行 wsl.exe 返回 exit -1073740791

    我在一台具有 WSL 适用于 Linux 的 Windows 子系统 的 Windows 10 计算机上设置了 jenkins 例如 当我从终端运行简单命令 C Windows System32 wsl exe help 时 它工作正常 使
  • 删除 Shapely 多边形外部的 numpy 网格点

    我有一个 10 x 10 网格 我想删除形状多边形之外的点 import numpy as np from shapely geometry import Polygon Point from descartes import Polygo
  • 如何为 powershell 函数的描述属性添加值?

    我想填充我在 PROFILE 中创建的 Powershell 函数的 Description 属性 我想向 描述 属性添加一个值 例如 在个人配置文件中创建 这可能吗 目前 如果我检查我的功能描述 我发现没有填充任何内容 例如 Get Co
  • 应该匹配 RSpec 期望语法

    正确的使用格式是什么应该匹配器 https github com thoughtbot shoulda matchers和 RSpec 的新期望语法 http myronmars to n dev blog 2012 06 rspecs n
  • 使用 Firebase android 时如何向用户添加用户名?

    我目前开始在我的 Android 应用程序中使用 Firebase 并使用其 GitHub 上的示例来创建登录和注册活动 https github com firebase quickstart android https github c
  • 在 onDragStop 事件中获取 Material UI Slider 值

    我想触发一个事件onDragStop而不是onChange使用材质 UISlider在我的 React 应用程序中 以便事件触发次数更少 但是 那文档 https mui com material ui react slider表明onDr
  • 尝试使用 ItemsControl.AlternationIndex 显示列表中的行索引

    我有以下 XAML 旨在将行号放在左列中 但所有输出都是0
  • 根据父 ID 值将数组从一维转换为多维

    我有一个代表多维数据的一维对象数组 array array id gt 45 parent id gt null array id gt 200 parent id gt 45 array id gt 345 parent id gt 45
  • 密码强度检查库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以推荐一个 Java 库 其中包含适合在 Web 应用程序中执行服务器端密码强度检查的方法 理想情况下 检查器应该是 可配置 允
  • 如何在Python中子类化str

    我正在尝试对 str 对象进行子类化 并向其添加几个方法 我的主要目的是学习如何去做 我陷入困境的是 我是否应该在元类中对 string 进行子类化 并使用该元创建我的类 或者直接对 str 进行子类化 而且 我想我需要实施 new 不知何
  • 使用 NHibernate 和动态匿名对象在 GroupBy 查询中进行选择

    我的主要目标是创建一个动态组并在 NHibernate 中使用它 考虑这个非动态的例子works repository Collection
  • 使 React 组件作为 Widget 可用

    我有一个复杂的 React 应用程序 包括渲染某些组件的身份验证等 并且有一个特定的组件 一个日期选择器 我希望其他用户将其作为 Google 地图的小部件嵌入到他们的网站上 我已经成功地将其作为 iFrame 进行共享 但我想了解如何将其
  • 使用贪婪正则表达式忽略可选后缀

    我正在 NET 中对如下所示的字符串执行正则表达式匹配 1 Lists General Discussion Waffles Win 2 Lists General Discussion Waffles Win 2 000 3 Lists
  • 使用 php 脚本中的 rsync 同步本地和远程文件夹,无需输入密码

    如何在 php 脚本中使用 rsync 同步本地和远程文件夹而不提示输入密码 我已经设置了一个公钥来自动为我的用户登录远程服务器 所以从 cli 上运行没有任何问题 rsync r a v e ssh l user delete local
  • 获取解析后的PHP文件

    我试图在解析 PHP 文件后获取其内容 然后将其存储在变量中 除了这个例子之外 我无法通过谷歌获得任何有用的信息 ob start include file content ob get clean 但这会以纯文本形式返回内容 即 标签仍然
  • 点击“后退”按钮时将数据保存在编辑文本中

    因此 在活动 1 中 我单击一个按钮进入活动 2 在活动 2 中 我将一些数据输入到 EditText 中 当我点击手机上的后退按钮时 它会将我带到活动 1 这是正确的 但如果我再次点击活动 1 按钮 我在 EditText 中输入的任何文
  • Android Handler.post,到底发生了什么

    几天以来 我试图弄清楚如果我执行代码到底会发生什么 void function somePreExecutionCode new Handler post new Runnable Override public void run some