Android--异步消息处理机制
2016-03-16 14:53
225 查看
一、异步消息处理机制:
1)由四个部分组成:Message、Handler、MessageQueue 和 Loope
--Message: 在线程之间传递的消息,它可以在内部携带少量信息,用于在不同线程之间交换数据;
--Handler: 主要用发送和处理消息(Message),发送消息:sendMessage(Message msg); 处理消息:handleMessage(Message msg);
--MessageQueue:消息队列,每个线程中只有一个消息队列,用于存放所有通过Handler发送的消息;
--Looper:是每个线程中的MessageQueue 的管家,调用其 loop() 方法后就会进入到一个无限循环当中,然后每当发现MessageQueue 中存在一条消息,就会将它取出,并传递到Handler 的handleMessage()方法中,每个线程也只有一个 Looper;
2)流程:
--在主线程中创建一个 Handler 对象,并重写其 handleMessage() 方法;
--当子线程中需要操作 UI 时,就创建一个 Message 对象,并通过创建的 Handler 对象将其发送出去;
--发送的 Message 会被添加到 MessageQueue 队列中等待被处理;
--而 Looper 则会一直尝试从消息队列中去取出消息,最后分发给 Handler 对象的handleMessage() 进行处理;
--在 handlerMessage() 方法中可以随意操作 UI, 从而达到目的;
二、AsyncTask:一个异步消息处理的工具,使用更为方便,基本用法:
1)AsyncTask是一个抽象类,使用时需要创建一个子类来继承它;
2)在继承时我们可以为AsyncTask 类指定三个泛型参数,这三个参数的用途如下:
--Params:在执行 AsyncTask时需要传入的参数,可用于在后台任务中使用;
--Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
--Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型;
--例:
3)需要重写 AsyncTask 中的几个方法才能完成对任务的定制:
--onPreExecute():这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作;
--doInBackground(Params...):这个方法中的所有代码都会在子线程中运行,所有的耗时任务都应该在这里进行处理。任务一旦完成就可以通过return 语句来将任务的执行结果返回。这个方法中不能进行 UI 操作,如果需要更新UI 元素,可以调用publishProgress(Progress...)方法来完成;
--onProgressUpdate(Progress...):当在后台任务中调用了publishProgress(Progress...)方法后,此方法被调用,方法中携带的参数就是后台任务中传递而来的,在此方法中可以对 UI 进行操作;
--onPostExecute(Result):当后台任务执行完毕并通过return 语句进行返回时,此方法被调用,返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI 操作;
4)创建完毕 AsyncTask 对象之后只需要调用其 execute() 方法即可启动任务;
5)总结:
--在doInBackground()方法中去执行具体的耗时任务;
--在onProgressUpdate()方法中进行UI 操作;
--在onPostExecute()方法中执行一些任务的收尾工作。
1)由四个部分组成:Message、Handler、MessageQueue 和 Loope
--Message: 在线程之间传递的消息,它可以在内部携带少量信息,用于在不同线程之间交换数据;
--Handler: 主要用发送和处理消息(Message),发送消息:sendMessage(Message msg); 处理消息:handleMessage(Message msg);
--MessageQueue:消息队列,每个线程中只有一个消息队列,用于存放所有通过Handler发送的消息;
--Looper:是每个线程中的MessageQueue 的管家,调用其 loop() 方法后就会进入到一个无限循环当中,然后每当发现MessageQueue 中存在一条消息,就会将它取出,并传递到Handler 的handleMessage()方法中,每个线程也只有一个 Looper;
2)流程:
--在主线程中创建一个 Handler 对象,并重写其 handleMessage() 方法;
--当子线程中需要操作 UI 时,就创建一个 Message 对象,并通过创建的 Handler 对象将其发送出去;
--发送的 Message 会被添加到 MessageQueue 队列中等待被处理;
--而 Looper 则会一直尝试从消息队列中去取出消息,最后分发给 Handler 对象的handleMessage() 进行处理;
--在 handlerMessage() 方法中可以随意操作 UI, 从而达到目的;
二、AsyncTask:一个异步消息处理的工具,使用更为方便,基本用法:
1)AsyncTask是一个抽象类,使用时需要创建一个子类来继承它;
2)在继承时我们可以为AsyncTask 类指定三个泛型参数,这三个参数的用途如下:
--Params:在执行 AsyncTask时需要传入的参数,可用于在后台任务中使用;
--Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
--Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型;
--例:
class DownloadTask extends AsyncTask<Void, Integer, Boolean> { …… }
3)需要重写 AsyncTask 中的几个方法才能完成对任务的定制:
--onPreExecute():这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作;
--doInBackground(Params...):这个方法中的所有代码都会在子线程中运行,所有的耗时任务都应该在这里进行处理。任务一旦完成就可以通过return 语句来将任务的执行结果返回。这个方法中不能进行 UI 操作,如果需要更新UI 元素,可以调用publishProgress(Progress...)方法来完成;
--onProgressUpdate(Progress...):当在后台任务中调用了publishProgress(Progress...)方法后,此方法被调用,方法中携带的参数就是后台任务中传递而来的,在此方法中可以对 UI 进行操作;
--onPostExecute(Result):当后台任务执行完毕并通过return 语句进行返回时,此方法被调用,返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI 操作;
4)创建完毕 AsyncTask 对象之后只需要调用其 execute() 方法即可启动任务;
5)总结:
--在doInBackground()方法中去执行具体的耗时任务;
--在onProgressUpdate()方法中进行UI 操作;
--在onPostExecute()方法中执行一些任务的收尾工作。
相关文章推荐
- Android时间轴简单优化
- Android数据库自动升级
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- Android 手机摇晃监听
- Android中Bitmap,byte[],Drawable,InputStream相互转化工具类
- 小米3Android开发学习笔记二
- Android在xml布局中找不到自定义属性的问题
- Android 应用程序获得版本号
- AndroidStudio修改单行注释灰不拉基的颜色
- Android使用gradle快速生成渠道apk包。
- Android应用打包安装过程具体解释
- Android 属性动画特效
- 【转】Android Support 包里究竟有什么
- Android Support v4,v7,v13的区别和应用场景
- Android ScrollView向上滑动控件顶部悬浮效果实现
- 利用 Android Studio 和 Gradle 打包多版本APK
- android camera(一):camera模组CMM介绍
- Android开发笔记(八十一)屏幕规格适配
- Android Fragment完全解析,关于碎片你所需知道的一切
- android camera(一):camera模组CMM介绍