您的位置:首页 > 移动开发 > Android开发

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各自的主要功能以及之间的关系
  三者之间的关联



三者之间的运转流程:



[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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Handler