Android异步消息机制及源码分析

本文详细分析了Android中的Handler、Looper和MessageQueue的工作原理,解释了它们如何协同处理异步消息。通过源码解读,展示了Handler如何发送消息到MessageQueue,Looper如何不断循环并分发消息给相应的Handler进行处理,以及整个异步消息机制在UI线程和工作线程间通信的角色。文章适合想要深入理解Android消息模型的开发者阅读。
摘要由CSDN通过智能技术生成

【yian_ http://blog.csdn.net/yianemail/article/details/50233373 转载烦请注明出处,尊重分享成果】

一直对Android中的消息处理机制比较模糊,恰好昨天做了一次Team知识分享,也就借此机会配合源码了解下消息处理机制,仅以博客记录。

1 前言

一:在分析别人的源码,一直都在workThread配合looper ,handler与uiThread交互互通Message。
二:对于很多初学者老说,大都是知其然而不知道其所以然的。
三:workThread与uiThread中间是怎样具体处理message的。

2 代码展示

你可能在刚开始接触Android开发时就会知道如下问题:

Android的UI时线程不安全的,如果在线程中更新UI会出现异常,导致程序崩溃;同时如果UI中做耗时操作又会导致臭名昭著的ANR异常。

为了解决如上这些问题,我们怎办呢?很简单,通常最经典常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象,使用Handler发送出去,然后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作)。所以说还是很有必要了解异步消息机制的Looper , Handler , Message等原理的。

一般我们在workThread通过handler发送meeesgae一般来说是这样的,首先是在workThread中发送消息,以及在uiThread中接受处理,于是,代码是这样的:

/**
 * Created by luhuanju on 15/12/8.
 */
public class TwoActivity extends Activity {
   
   static Handler handler=new Handler(){
       @Override
       public void dispatchMessage(Message msg) {
           super.dispatchMessage(msg);
           switch (msg.what=0){
              //msg
           }


       }
   };
    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            @Override
            public void run() {
                Message message=handler.obtainMessage(0);
                message.obj="";//Object
                handler.sendMessage(message);

            }
        }).start();

    }
}

这就是我们平时用的Handler的过程,对于Handler异步处理的简单基础示例先说到这,接下来依据上面示例的写法分析原因与源代码原理。

3 分析Android异步消息机制源码

3-1异步消息概念流程图

handler.sendMessage —>MQ(looper不断循环取消息,一旦有新消息) —>handler(dispatchMessage);

3-2异步消息机制相关重要概念
3-2-1 Handler的工作原理

由例子代码很容易看出Handler 的工作主要包含发送消息以及处理消息,典型的发送一条消息snedMessage的源码如下:

    /**
     * Pushes a message onto the end of the message queue after all pending messages
     * before the current time. It will be received in {@link #handleMessage},
     * in the thread attached to this handler.
     *  
     * @return Returns true if the message was successfully placed in to the 
     *         message queue.  Returns false on failure, usually because the
     *         looper processing the message queue is exiting.
     */
    public final boolean sendMessage(Message msg)
    {
        return sendMessageDelayed(msg, 0);//sendMessage继续调用了sendMessageDelayed
    }

可以看到sendMessage继续调用sendMessageDelayed,继续查看

    public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }

sendMessageDelayed 又继续调用了sendMessageAtTime,
sendMessageAtTime(Message msg, long uptimeMillis)方法有两个参数;msg是我们发送的Message对象,uptimeMillis表示发送消息的时间,uptimeMillis的值等于从系统开机到当前时间的毫秒数再加上延迟时间。

继续

    public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        MessageQueue queue = mQueue;
        if (queue == null) {
            RuntimeException e = new RuntimeException(
                    this + " sendMessageAtTime() called with no mQueue");
            Log.w("Looper", e.getMessage(), e);
            return false;
        }
        return enqueueMessage(queue, msg, uptimeMillis);
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值