Handler,Looper,Message,MessageQueue,Thread机制的深入理解(举例说明)

相关名词简介

1、 MessageQueue 消息队列

   承载消息的容器      
 //取消息
 - final Message next() 
 //移除消息
 - final boolean removeMessages(Handler h, int what, Object object,boolean doRemove)
 - final void removeMessages(Handler h, Runnable r, Object object)
 //移除消息及回调
 - final void removeCallbacksAndMessages(Handler h, Object object)
 //初始化唤醒消息
 - final boolean enqueueMessage(Message msg, long when) 

2、 Message 消息

传递的实体内容
  //消息标识符,类似id字段
 - public int what;
 //传递的int值,如果消息传递的内容仅仅是int值时,可以降低开销
 - public int arg1;    
 - public int arg2;
 //消息的内容对象
 - public Object obj;
 //消息内容
 - Bundle data;
 //时间
 - long when;
 //发送的目标处理者
 - Handler target;     
 //子线程
 - Runnable callback;   
 //消息池最大消息量
 - private static final int MAX_POOL_SIZE = 10;

3、Handler 处理机

 消息的上传和处理者
 //消息队列
 - final MessageQueue mQueue;
 //消息队列的管理员
 - final Looper mLooper;
 //消息处理的回调接口
 - final Callback mCallback;
 //消息处理,一种runnable的消息,直接执行,一种就需要目标handler去处理
 - public void dispatchMessage(Message msg)
 //发送runnable消息,还有其他重载方法
 - public final boolean post(Runnable r)
 //发送消息,还有其他重载方法
 - public boolean sendMessageAtTime(Message msg, long uptimeMillis) 

4、Looper 管理员

消息管理员,负责从消息队列取消息交给handler处理
//构建looper对象
public static void prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        //将looper写入thread缓存,myLooper() 中能够得到缓存的looper
        sThreadLocal.set(new Looper());
    }
//私有构造器,初始化队列
private Looper() {
        mQueue = new MessageQueue();
        mRun = true;
        mThread = Thread.currentThread();
    }
---------------------------------------------------------------
//特别说明,此方法是取消息,交给handler处理
public static void loop() {
        //获取looper对象
        Looper me = myLooper();
        if (me == null) {
            throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
        }
        //获取消息队列
        MessageQueue queue = me.mQueue;
        ...
        //不停的取消息
        while (true) {
            //获取消息
            Message msg = queue.next();
            if (msg != null) {
                if (msg.target == null) {
                    return;
                }
                ...
                //发送给handler处理
                msg.target.dispatchMessage(msg);
                ...
                //回收消息
                msg.recycle();
            }
        }
    }

将handler机制比喻为流水线,更生动的分析其机制

Handler,Looper,Message,MessageQueue,Thread机制的深入理解(举例说明)_第1张图片

流程分析

Handler,Looper,Message,MessageQueue,Thread机制的深入理解(举例说明)_第2张图片

你可能会想,为什么handler所在的主线程不自己去直接处理请求,而需要通过handler、message和looper来实现,其实这是为了线程安全来考虑。都知道非UI线程是不允许直接更新ui,但是如果你直接去在UI线程里面取网络数据,或者做一些耗时操作的时候,将会阻塞UI绘制,导致ANR,所以需要需要这套机制,如果有耗时任务的话通过runnable的异步任务来执行,得到结果后再通知handler更新UI

你可能感兴趣的:(android,handler,message,looper,举例说明)