Android异步消息处理和应用
2017-07-23 13:14
344 查看
介绍Handler, Looper, MessageQueue, Message之间的关系
ref:
[align=left]http://blog.csdn.net/lmj623565791/article/details/38377229/[/align]
一.Handler, Looper, MessageQueue各自的主要功能以及之间的关系
三者之间的关联
![](http://img.blog.csdn.net/20170723131238060?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh6X2V1bGI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
三者之间的运转流程:
![](http://img.blog.csdn.net/20170723131335729?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh6X2V1bGI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left][/align]
[align=left]Thread/Runnable:[/align]
[align=left]
[/align]
[align=left]应用一般将消息处理放在非阻塞的线程里面[/align]
[align=left]
[/align]
[align=left]通过Handler来接收handle message[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]Handler:[/align]
[align=left]1.提供消息接口[/align]
[align=left]
[/align]
[align=left]发送消息存储到消息队列mQueue: sendMessage[/align]
[align=left]
[/align]
[align=left]获取消息对象空间并赋值:obtainMessage[/align]
[align=left]
[/align]
[align=left]消息回调接口:dispatchMessage 最终是调用消息handleMessage来处理消息,但实际一般由父类重写的handleMessage来处理.[/align]
[align=left]
[/align]
[align=left]2.关联MessageQueue[/align]
[align=left]
[/align]
[align=left]3.获取looper[/align]
[align=left][/align]
[align=left]Looper:[/align]
[align=left][/align]
[align=left]1.每个线程只能创建一个looper[/align]
[align=left]
[/align]
[align=left]2.looper最好不要放在主线程中或者容易阻塞的接口或模块里面[/align]
[align=left]
[/align]
[align=left]3.每个线程中Looper.prepare ->Looper.loop最好只调用一次,否则会抛异常.[/align]
[align=left]
[/align]
[align=left]Looper主要包含[/align]
[align=left]
[/align]
[align=left](1)消息队列MessageQueue , 与Handler的mQueue进行关联[/align]
[align=left]
[/align]
[align=left](2)loop循环分发消息,调用Message.target.dispatchMessage(msg);[/align]
[align=left]
[/align]
[align=left]其中第2点,举个例子:[/align]
[align=left]
[/align]
[align=left]但调用prepare阻塞时,主线程受阻, 底层通过mEventHandler 发送消息的时候,主线程的looper就无法发送和处理消息了.[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]MessageQueue:[/align]
[align=left]管理消息Message,增加,删除.[/align]
ref:
[align=left]http://blog.csdn.net/lmj623565791/article/details/38377229/[/align]
一.Handler, Looper, MessageQueue各自的主要功能以及之间的关系
三者之间的关联
三者之间的运转流程:
[align=left][/align]
[align=left]Thread/Runnable:[/align]
[align=left]
[/align]
[align=left]应用一般将消息处理放在非阻塞的线程里面[/align]
[align=left]
[/align]
[align=left]通过Handler来接收handle message[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]Handler:[/align]
[align=left]1.提供消息接口[/align]
[align=left]
[/align]
[align=left]发送消息存储到消息队列mQueue: sendMessage[/align]
[align=left]
[/align]
[align=left]获取消息对象空间并赋值:obtainMessage[/align]
[align=left]
[/align]
[align=left]消息回调接口:dispatchMessage 最终是调用消息handleMessage来处理消息,但实际一般由父类重写的handleMessage来处理.[/align]
[align=left]
[/align]
[align=left]2.关联MessageQueue[/align]
[align=left]
[/align]
[align=left]3.获取looper[/align]
[align=left][/align]
[align=left]Looper:[/align]
[align=left][/align]
[align=left]1.每个线程只能创建一个looper[/align]
[align=left]
[/align]
[align=left]2.looper最好不要放在主线程中或者容易阻塞的接口或模块里面[/align]
[align=left]
[/align]
[align=left]3.每个线程中Looper.prepare ->Looper.loop最好只调用一次,否则会抛异常.[/align]
[align=left]
[/align]
[align=left]Looper主要包含[/align]
[align=left]
[/align]
[align=left](1)消息队列MessageQueue , 与Handler的mQueue进行关联[/align]
[align=left]
[/align]
[align=left](2)loop循环分发消息,调用Message.target.dispatchMessage(msg);[/align]
[align=left]
[/align]
[align=left]其中第2点,举个例子:[/align]
android.media; public class MediaPlayer ... { private EventHandler mEventHandler; private Looper mSavelogLooper = null; public MediaPlayer() { Looper looper; if ((looper = Looper.myLooper()) != null) { mEventHandler = new EventHandler(this, looper); //使用主线程的looper [可能来activity之类的主线程的looper] ===>From: Activity->ActivityThread->Looper.prepareMainLooper() } } public native void prepare(); public class SaveLogThread extends Thread { //子线程单独创建一个Looper并启动loop. public Handler mHandler; public SaveLogThread(){ super(); } public void run() { Looper.prepare(); mSavelogLooper = Looper.myLooper(); mHandler = new Handler() { public voidhandleMessage(Message msg) { ... }); Looper.loop(); }
[align=left]
[/align]
[align=left]但调用prepare阻塞时,主线程受阻, 底层通过mEventHandler 发送消息的时候,主线程的looper就无法发送和处理消息了.[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]MessageQueue:[/align]
[align=left]管理消息Message,增加,删除.[/align]
相关文章推荐
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android异步消息处理机制(4)AsyncTask源码解析
- Android 异步消息处理机制
- Android Native层异步消息处理框架
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- Android异步消息处理机制之Handler、Looper、Message
- Android异步消息处理实例
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android异步通讯范例(异步消息处理) 一
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- Android系统中异步消息处理线程机制的理解
- 深入理解Android异步消息处理机制
- Android 解析异步消息处理机制
- Android消息队列(二)--异步消息处理
- Android之异步处理Handler和消息机制处理
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系