一切从Android的Handler讲起(一):Handler工作机制
有关Handler原理的相关博文或者书本有很多,包括肥柴本人也写过相关的博文,包括基础原理篇:Android基础知识(九):Handler机制的原理分析、基础使用方式篇:Android基础知识(十):Handler的使用方式与注意事项以及原理探究篇:Android进阶知识(二十二):Android的消息机制。
之所以单独开一个篇章来讲讲Handler,原因是肥柴在重看Handler的时候发现如果从Handler出发,可以牵扯的东西有很多,甚至牵扯到了Android Framewrok层——Android Activity的启动、Android生命周期的回调等等。
这个篇章将从Handler的工作机制入手,由浅入深逐个分析涉及的底层原理及在Android中的应用。起始篇则先概要的描述Handler的工作机制。
那么首先我们来看下Handler的工作机制图。
从Handler的工作机制图,可以得知:
1、Handler负责消息的发送和处理:Handler发送消息给MessageQueue和接收Looper返回的消息并且处理消息。
2、Looper负责管理MessageQueue:Looper会不断地从MessageQueue取出消息,交给Handler处理。
3、MessageQueue是消息队列(实际上用链表实现),负责存放Handler发送过来的消息。
4、一个Looper对应一个线程(自己所在的线程,如线程B)。
用一句话来描述其工作机制就是:每个线程里只能有唯一的Looper和与之绑定的MessageQueue,Looper不断的从MessageQueue里取Message,交给对应的Handler的handleMessage处理。
而从上面的Handler工作机制,肥柴可以得知Hanlder的切换线程原理如下图。
Handler的切换线程原理:
1、Looper的loop()方法运行在其创建的线程(线程B)中,同时Looper创建时对应的创建了MessageQueue;
2、当Handler在线程A中发送一条消息存放到MessageQueue时,Looper的loop()方法在线程B把消息取出来,并交给Handler处理,所以Handler的处理消息的方法是运行在Looper所在的线程(线程B)的。
概述起来就是:由于多个线程之间共享内存空间,所以Handler可以在线程A把消息存放到MessageQueue,Looper可以在线程B把消息取出来,一存一取就实现了线程的切换。
以上便是Handler的工作机制概要,从表面上是比较容易理解的,那么Android内部是如何实现这一机制的呢?而这个机制又对Android底层有什么重大意义呢?这就是肥柴这个篇章要讲的:一切从Android的Handler讲起。
- - - - - 起始篇完 - - - - -