十八、Android_消息机制&异步任务

本文详细介绍了Android中消息机制的重要性和实现方式,包括Handler和Message的使用,以及线程间通信的步骤。同时,解释了AsyncTask的两种理解角度,即作为多线程功能的简化实现和具体API的使用,强调了其高效性和编码简洁性。文章还探讨了AsyncTask的运行原理,展示了如何在Android应用中实现异步任务和UI更新。

Android_消息机制&异步任务

消息机制

消息机制的引入
1)在android中只有在UIThread中才能直接更新界面
2)在android中,长时间的工作(联网)都需要在workerThread中执行
3)在分线程获取服务器数据后,需要立即到主线程去更新界面显示数据

如何实现线程间通信?
消息机制:Handler + Thread
异步任务:AsyncTask == Handler + ThreadPool

Message的使用

(线程间通信的数据载体)可理解为线程间通讯的数据单元, 可通过message携带需要的数据
1)对象的创建

	Message.obtain(); // 有可能是创建的,也可能是复用的消息池中的

2)对象的使用

	int what;//标识
	int args1;
	int args2;
	Object obj;
	Handler target          // 保存处理消息的Handler对象(发消息的handler)
	long when;            // 消息应该被处理的时间
	Message next;        // 有了此属性,Message就可以形成队列
	static Message pool;  // 消息池,缓存用过的消息,用于复用
	Runnable callBack;  // 用于处理当前消息的回调器

Handler的使用

1)对象的创建
new Handler();
2)对象的使用
发送消息
发送即时消息:sendMessage(Message msg);
发送延时消息:sendMessage(Message msg,long delayTime);
发送即时的空消息:sendEmptyMessage(int what);
发送延时的空消息:sendEmptyMessageDelayed(int what,long delayTime);
处理消息
void handleMessage(Message msg);//回调方法
移除消息
removeMessage(int what);移除指定what的未处理的message
removeCallbackAndMessages(null); 移除所有未处理的消息
使用步骤
1)创建Handler成员变量对象, 并重写其handleMessage()
2)在分/主线程创建Message对象
3)使用handler对象发送Message
4)在handleMessage()中处理消息
使用总结
Handler用于做什么工作?
1)线程间通信(分线程切换至主线程运行)
2)延迟的工作
3)定时循环工作

相关API

MessageQueue : 消息队列
用来存放通过Handler发送的消息
它是一个按Message的when排序的优先级队列
Looper(钩子) : 循环器
负责循环取出Message Queue里面的当前需要处理的Message
交给对应的Handler进行处理
处理完后, 将Message缓存到消息池中, 以备复用
【队列、栈是一种抽象的内存结构,在内存中真实存在的数据结构仅数组和列表。抽象的结构必须通过真实的结构去实现和包装】

消息机制的原理
在这里插入图片描述
在这里插入图片描述

AsyncTask

异步任务的理解:

第一种理解(逻辑上的理解):以多线程的方式完成的功能需求
a.没有它之前我们用Handler+Thread实现一个异步任务的功能
b.使用AsyncTadk也可以,为什么要用它?
1)编辑简洁:填空题与问答题的区别
2)运行效率高:线程池
AsyncTask是对Handler和Thread的封装, 使用它更编码更简洁,更高效
AsyncTask封装了ThreadPool, 比直接使用Thread效率要高

第二种理解(API上的理解):指AsyncTask类

相关API:

1、AsyncTask: 简化Handler处理多线程通信的问题
AsyncTask<Params, Progress, Result>
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
2、execute(Params… params):启动任务, 开始任务的执行流程
3、void onPreExecute():在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
4、Result doInBackground(Params… params):在workerThread中执行完成任务的主要工作,通常需要较长的时间
5、void onPostExecute(Result result):在doInBackground()执行完后在UIThread中执行,一般用来更新界面
6、publishProgress(Progress… values) : 在分线程中, 发布当前进度
7、void onProgressUpdate(Progress… values) : 在主线程中更新进度

AsyncTask的原理
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值