欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android异步消息处理和应用

程序员文章站 2022-05-14 17:57:31
...
介绍Handler, Looper, MessageQueue, Message之间的关系
ref:

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

Android异步消息处理和应用

三者之间的运转流程:
Android异步消息处理和应用

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,增加,删除.
相关标签: Handler