当前位置: 首页 > news >正文

安卓基础之《(29)—消息机制与异步任务》

一、线程概述

1、在android中,只有在ui Thread中才能直接更新界面
ui Thread又叫main Thread、主线程

2、在android中,长时间的工作(联网)都需要在workerThread中执行
workerThread又叫分线程、子线程

3、在分线程获得服务器数据后,需要立即到主线程去更新界面显示数据(切换到主线程)

4、如何实现线程间通信呢,用消息机制

二、消息机制

1、Message
(1)可理解为线程间通讯的数据单元,可通过Message携带需要的数据
(2)创建对象
Message.obtain(what)
(3)封装数据

2、Handler
(1)Handler是Message的处理器,同时也负责消息的发送和移除的工作
(2)发送即时消息:sendMessage(Message msg)
(3)发送延时消息:sendMessageDelayed(Message msg, long time)
这里延迟是延迟处理,处理时间=当前时间+延迟时间
(4)处理消息(回调方法):handleMessage(Message msg)
(5)移除还未处理的消息:removeMessages(int what)

3、MessageQueue
(1)消息队列,用来存放通过Handler发送的消息
(2)它是一个按照Message的when排序的优先级队列

4、Looper
(1)钩子,循环器
(2)负责循环取出MessageQueue里面的当前需要处理的Message
(3)交给对应的Handler进行处理
(4)处理完后,将Message缓存到消息池中(线程池),以备复用

5、原理图

6、Message类说明

重要属性:
public int what; // 标识
public int arg1; // 保存int数据
public int arg2; // 保存int数据
public Object obj; // 保存对象数据
long when; // 延迟的时间
Handler target; // 保存处理Message的Handler对象的引用
Runnable callback; // 用来处理消息的回调监听
Message next; // 指向下一个Message
Message sPool; // 用来缓存处理过的Message

callback的Runnable对象的run()方法,什么时候在分线程执行?
将Runnable传给Thread的构造方法

7、Handler类说明
功能:发送消息,处理消息,移除消息

方法:
sendMessage(); // 发送消息
sendEmptyMessage(); // 发送不带数据的消息
handleMessage(); // 处理消息的回调方法

8、MessageQueue类说明
功能:存储消息,以message的when排序的优先级队列

9、Looper类说明
功能:从MessageQueue中获取当前需要处理的消息,并交给Handler处理

三、异步任务

1、什么是异步任务
(1)逻辑上:以多线程的方式完成的功能需求
(2)API上:指AsyncTask类

2、AsyncTask类
(1)在没有AsyncTask之前,我们用Handler+Thread就可以实现异步任务的功能需求
(2)AsyncTask是对Handler和Thread的封装,使用它编码,更简洁更高效
(3)AsyncTask封装了ThreadPool,比直接使用Thread效率高
(4)AsyncTask<Params, Progress, Result>
Params:启动任务执行的输入参数,比如HTTP请求的URL
Progress:后台任务执行的百分比
Result:后台执行任务最终返回的结果,比如String

3、AsyncTask类方法
(1)execute(Params... params)
启动任务,开始任务的执行流程
(2)void onPreExecute()
在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
(3)Result doInBackground(Params... params)
在workThread中执行,完成任务的主要工作,通常需要较长时间
(4)void onPostExecute(Result result)
在doInBackground()执行完后在UIThread中执行,一般用来更新界面
(5)void publishProgress(Progress... values)
在分线程中,发布当前进度
(6)void onProgressUpdate(Progress... values)
在主线程中更新进度

4、过程分析
启动异步任务:new AsyncTask<Params, Progress, Result>().execute()

http://www.jsqmd.com/news/732232/

相关文章:

  • 2026年5月最新宝珀官方售后网点核验报告(含迁址/新开)|亲测全流程记录 - 亨得利官方服务中心
  • 从零到上线:手把手教你用Vue3+OpenLayers搭建一个企业级GIS管理系统(兼容IE11)
  • Maccy:重新定义macOS剪贴板管理的工作流优化方案
  • 2025届毕业生推荐的十大降AI率网站横评
  • Windows 11任务栏拖放修复:终极免费解决方案完全指南
  • 从设计到售后:如何把FMEA、FTA和FRACAS串起来,打造产品可靠性闭环
  • Taotoken 模型广场功能在项目技术选型中的实际应用
  • CL9936系列低压差电压稳压器
  • 基于STM32单片机智能核酸采样机器人机械臂搬运设计定制23-061
  • 【AutoMV 】多模态使用情况
  • 避坑指南:第一次用Gurobi求解设施选址问题,我踩过的那些坑(附Python代码)
  • 终极免费数据恢复指南:如何使用TestDisk和PhotoRec挽救丢失的分区与文件
  • 17.一个电话号码的字母组合回溯(backtrack)解法
  • 基于STM32单片机智能篮球计分器无线蓝牙WiFi视频监控设计23-407
  • 八大网盘直链解析工具:重新定义文件下载体验的技术革命
  • 3分钟搞定微信语音转MP3:silk-v3-decoder音频转换神器
  • 告别传统对接!用DiffDock+扩散模型搞定药物发现,Ubuntu 22.04保姆级安装避坑指南
  • 文章十六:ElasticSearch 使用enrich策略实现大宽表
  • 雀魂牌谱屋完全指南:三步实现麻将数据分析,快速提升竞技水平
  • VR视频转换终极指南:3D到2D的简单完整解决方案
  • PHP 9.0 Fiber与ReactPHP双引擎选型指南(异步架构决策树V2.3正式发布)
  • CL9975 100mA 低功耗LDO稳压器
  • 开发智能客服场景时,如何借助多模型能力提升回答质量与稳定性
  • 终极指南:5分钟学会用ArchivePasswordTestTool找回压缩包密码
  • 127种语言的语音合成奥秘:espeak-ng如何用4MB内存征服全球发音
  • 从OMA标准文档到实战:手把手解析SUPL协议中的关键消息流(附代理与非代理模式对比)
  • 使用taotokencli工具一键配置团队开发环境与统一模型端点
  • WindowResizer:如何用免费工具强制调整任意窗口大小
  • 通过标准 OpenAI 协议将现有应用无缝迁移至 Taotoken 平台
  • FlexiCubes技术解析:提升3D网格质量的创新方法