Android异步消息处理和应用

来源:互联网 发布:python opencv教程 编辑:程序博客网 时间:2024/06/05 05:30
介绍Handler, Looper, MessageQueue, Message之间的关系
ref:
http://blog.csdn.net/lmj623565791/article/details/38377229/

一.Handler, Looper, MessageQueue各自的主要功能以及之间的关系
  三者之间的关联



三者之间的运转流程:

Thread/Runnable:

应用一般将消息处理放在非阻塞的线程里面

通过Handler来接收handle message


Handler:
1.提供消息接口

发送消息存储到消息队列mQueue: sendMessage

获取消息对象空间并赋值:obtainMessage

消息回调接口:dispatchMessage 最终是调用消息handleMessage来处理消息,但实际一般由父类重写的handleMessage来处理.

2.关联MessageQueue

3.获取looper

Looper:

1.每个线程只能创建一个looper

2.looper最好不要放在主线程中或者容易阻塞的接口或模块里面

3.每个线程中Looper.prepare ->Looper.loop最好只调用一次,否则会抛异常.

Looper主要包含

(1)消息队列MessageQueue , 与Handler的mQueue进行关联

(2)loop循环分发消息,调用Message.target.dispatchMessage(msg);

其中第2点,举个例子:
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();        }



但调用prepare阻塞时,主线程受阻, 底层通过mEventHandler 发送消息的时候,主线程的looper就无法发送和处理消息了.


MessageQueue:
管理消息Message,增加,删除.
原创粉丝点击