Android中消息系统模型和Handler Looper.docx
《Android中消息系统模型和Handler Looper.docx》由会员分享,可在线阅读,更多相关《Android中消息系统模型和Handler Looper.docx(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Android中消息系统模型和Handler Looper作为Android中大量使用的Handler,结合Thread使其具有众多的使用形式和方法,让我一时感觉这个东西有些玄乎,不明所以然,这到底是一个什么样 的存在呢?通过网上资料和源码的学习,这个Handler也差不多弄清楚了,现在总结下 这个学习结果。-Handler作用和概念通过官方文档了解到Handler的大致概念是:Handler能够让你发送和处理消息,以及Runnable对象;每个Handler对象对应一个Thread和Thread的消息队列。当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消
2、息和runnable对象到消息队列中,执行消息后就从消息队列 中退出。Handler的作用就是:调度消息和runnable对象去被执行;使消息系统模型的核心是Loopero下面看看Handler是如何建立跑起来的,以msg消息为例,runnable实质是一样。1 Handler的建立Handler唯一属于某个Thread,在某个Thread中建立Hand ler时,需要获取Thread的Looper及其MessageQueue,建立Handler关键是Looper的来源。Handler提供了好几个构造函数但其本质一致:由外部传入Looper:当前线程或其他线程电public Handler(L
3、ooper looper) /初始化构建消息系统参数mLooper = ;mQueue = looper.mQueue;mCallback = null;)电从当前线程获取:由创建Handler的Thread决定电public Handler () /初始化构建消息系统参数mLooper = www .12youhui . com r.myLooper();mQueue = mLooper.mQueue;mCallback = null;public static Looper myLooper() return sThreadLocal.get (); 电不管哪种方式,我们知道Thread在
4、默认情况下是没有建立消息循环Looper实例的。要实现消息循环必须确保Thread的Looper建立。如何确保呢?Looper提供了静态函数:电public static void prepare () if (sThreadLocal .get () ! = null) throw new RuntimeException (nOnly one Loop工 may be cr eated per www. cp0 61 , comn);)sThreadLocal.set(new Looper (); /存储线程的局部变量static final ThreadLocal sThreadLoca
5、l = new ThreadLocal ();电看到这里刚开始让我很是奇怪和迷惑:Looper 一个独立的类,又不属于某个Thread,而这里创建Lo oper的函数又是静态的,属于整个Looper类;创建Looper之后交给静态成员变量sThreadLocal保存,获取sThreadLocal.get(),那么一个静态变量属于整个类,属性更改始 终有效。一次创建之后sThreadLocal.get。永远都不等于 null!而Thread和Looper是唯一对应的,那这里岂不是所有的Thr ead都是用同一个Looper,不可能!所以肯定这个ThreadLocal是有玄机的。网上一查:Thre
6、adLocal:维护线程的变量,为每个使用该变量的线程实例提供独立的 变量副本,每个线程都能够独立使用该变量,而互不影响。(详细可参考:)所以每一个线程调用Looper.prepare 0t,都会创建为其唯一的 Loopero要建立Handler,需要先创建线程的Looper,才能建立消息系 统模型。通过Looper我们建立了Thread上的消息系统模型Handler,可以来进行消息系统的一系列 流程了。2消息发送消息发送两种方式:post sendMessage;post:针对runnable对象;Runnable是一个接口,就是一个回调函数(提供了 run方法)sendMessage:针对
7、 Message 对象;下面通过代码具体看一下这个过程:电public final boolean post( www , scujuu , com r) return sendMessag D layed (get PostMes sage (r) , 0);)public final boolean sendMessage(Message msg) return sendMessageDelayed (msg, 0); 电看到post和sendMessage发送消息时,仅仅是对象不同而已,Runnable 和 Message;但实际上都是Message的形式来描述。这跟我通常理解的消息机制
8、不同:通常post消息是将消息加入到消息队列中并不立即执行就返 回,send消息是立即执行等待消息执行完才返回。而这里post或者send都是将消息放入到消息队列中,然后立即返回,等待消息循环时获取消息被执行。这里提供了众多的消息发送方法来指定消息的执行时间和顺序, 具体可以查看源代码。消息执行顺序是根据消息队列中消息的排列顺序而定。下面看一下发送消息后将消息加入到消息队列中的代码:由 Handler 调用 MessageQueue 的 enqueueMessage 方法:final boolean enqueueMessage (Message msg, long when) Message
9、 p = mMessages;if (p = null | | when = 0 | | when p.when) msg. www.bboby. com = p;mMessages = msg;)else Message prev = null;while (p ! = null & & p, when = when) prev = p;p = p.next; )msg.next = prev.next; prev.next = msg;)可以看到是按照时间顺序将消息加入到MessageQueue中;现在将消息加入到消息队列中存储起来,消息并未得到处理,下一步 必然是如何派发消息和处理消息。
10、3消息派发建立Thread消息循环由Looper完成,存在一个消息调度死循环:电public static void loop () MessageQueue queue = me.mQueue; while (true) Message msg = queu next ( ) ;/ might block if (msg ! = null) if (msg. target = null) / No target is a magic identifier for the quit messag e.return; )/派发消息至U target (Handler) msg . target.
11、dispatchMessage(msg);/回收 Msg 至ImsgPool msg. www .12youhui . com e();) )电这里看到消息派发是由Message的target完成,这个target是什么呢?是一个Handler。消息系统是通过Handle用来与外部交互,把消息派发出去。可以 看到没有这个Handler,消息循环将结束。消息派发由Looper通过Handler完成:电public void dispatchMessage(Message msg) /首先判断runnable对象if (msg. callback ! = null) handlecallback(
12、msg);)else /整个消息系统的回调函数 可以不用实现自己Handler if (mCallback ! = null) if (mCallback.handleMessage(msg) return;)/消息处理 通常交给Handler派生类 handleMessage(msg);)电通过消息派发,这样就实现消息的异步处理。4消息原型前面看到消息发送有两种方式: post (Runnable 对象),sendMessage (Message 对象),而中间都是通过Message对象保存在MessageQueue中。然后消息派发时处理方式不同。如果在sendMessage时将将消息对象附
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android中消息系统模型和Handler Looper Android 消息 系统 模型 Handler
限制150内