您的位置:首页 > 移动开发 > Android开发

源码分析Handler机制

2017-05-03 16:02 211 查看

Handler机制

Message(消息)

消息的创建:

调用Message.obtain()方法,当sPool消息池为空就创建消息对象

消息的next属性:

消息对象通过next属性指向下一个消息对象

消息的when属性:

long类型变量when,记录自己发送时间

消息的target成员变量:

消息对象中有一个Handler类型的成员变量target

这个target记录此消息对象是由哪个Handler创建的

多个Handler对象给消息队列发送消息,最终消息由谁处理,取决于消息由谁发送。(谁发送谁处理)

处理消息时调用Message.target.handleMessage();也就是Handler.handleMessage();

Handler(处理器)

Handler的创建:

应用启动时候,ActivityThread主线程会创建Handler和MessageQueue,并启动Handler

handler发送消息:

Handler.sendMessage();发送消息

Handler处理消息:

Handler.handleMessag();处理消息

Looper(轮循器)

Lopper何时开始轮循:

只有当主线程ActivityThread调用Looper.loop();才开始轮循

Looper.loop();是个while(true){}的死循环

Looper轮循的原理:

由于android的内核是Linux,所以也继承了Linux的进程间通信机制–“管道”

管道的原理:

在内存中有一个特殊的文件,这个文件有两个句柄(引用),一个是读取句柄,一个是写入句柄。

内存中会有一块共享空间和两个流,一个主线程的读操作,一个子线程的写操作

只有当子线程进行写操作时,主线程才会进行写操作

Looper的原理:

主线程Looper从消息队列读取消息,当读完所有消息时,进入睡眠,主线程阻塞。

子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据

主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠

MessageQueue(消息队列)

消息队列的数据结构:

MessageQueue是个队列结构,但由于Message对象通过next指向下一个消息对象,所以又类似于单链表结构

消息入队:

MessageQueue.enquqeueMessage(Message msg,long when);将消息入队

MessageQueue处理消息的顺序由when决定,when越小越靠前

当(p == null || when==0 || when < p.when)将消息插入队首,优先处理

否则比较when参数确定消息所在位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息