Android基础——Handler消息传递机制解析

Handler消息传递机制

·实现多线程通信(发送消息、处理消息、切换线程)
·主线程(UI线程)不能执行耗时的操作,耗时操作放到子线程去执行
Android(Activity)---->UI(主)线程—>子线程
一个Activity只有一个主线程,主线程会自动创建MessageQueue和一个Looper
(UI线程不能执行耗时任务,要交给子线程,子线程执行完任务后,又不能把结果直接反馈到UI上,需要先把结果给UI线程,由UI线程去更新UI。)
在这里插入图片描述

·四大成员:handler、Message、MessageQueue、looper

Message:封装需要传递的消息,可以传递数据(使用obtain去创建),内容是子线程对UI的一些操作;
MessageQueue:消息队列,但是它的内部实现并不是用的队列,而是通过一个单链表的数据结构来维护消息列表(方便插入、删除)。主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);
Looper:不断循环执行(Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。

·Handler异步处理流程:

1)在主线程创建一个Handler对象,并重写handleMessage() 方法
2)子线程需要处理UI操作时,就创建一个Message对象,并通过Handler将该消息发送出去
3)发出的消息会被添加到MessageQueue中,等待被处理
4)Looper一直看MessageQueue 中有没有消息,有的话就分发回Handler的 handleMessage()中。在 Hanlder 的构造函数中,我们传入了 Looper.getMainLooper(),所以handleMessage() 方法会在主线程中运行。

·Handler机制:

1)Handler发送和接受处理Message:Handler发送消息只是调用MessageQueue的enqueueMessage(有同步代码块,保证不同线程的多个handler往MessageQueue中发送消息时的线程安全)插入一条信息到MessageQueue(send方法)
(Handler)sendMessageAtTime---->(MessageQueue) enqueueMessage(入队)
2)Looper轮询Message(在MessageQueue中loop方法): 死循环,调用MessageQueue的next方法(也有同步代码块)让message出队,然后调用Handler中的dispatchMessage方法让handler自己去处理消息
Message–next()出队–>Message–next()出队–>Message
3)MessageQueue插入和删除Message: next到Message之后就交给Handler自己处理,处理完成之后就继续循环轮询
·虽然是死循环,但不会卡住:
linux下的通信机制(管道通讯):内存中的一个特殊文件:读引用和写引用,当写的一端写入内容时,读的一端就会被唤醒,读的一端在没有读到消息时就会休眠。无消息时会阻塞在next()方法中nativePollOnce()代码行,释放CPU资源进入休眠。
·一个线程可以有多个Handler (任何地方可以直接new),而对于Handler来说,一个Handler只能实例化在某一个线程中,但其引用可以在任意多个线程(即消息的发送端有多个,接收端只有一个)。
发送端有多个:一个线程的多个handler都可以发送消息
接收端只有一个:一个线程中只有一个MessageQueue接收
· 一个线程只有一个looper,(线程被创建时源码中就会通过ThreadLocal进行线程与Looper的绑定,使用Object[],在调用Looper的prepare方法去创建其时,源码中会去调用ThreadLocal的get去判断,如存在抛出异常,不存在则调用set进行创建绑定;如果是主线程,则源码已经在ActivityThread的main方法中创建好了,可以直接在主线程中new和使用,子线程中却需要调用Looper prepare()创建looper(一个线程只能创建一个),同时创建MessageQueue)
·一个looper又唯一对应一个MessageQueue(主线程创建MessageQueue之后,自动进入消息循环,子线程则需要调用Looper loop()方法进入循环)。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44901971/article/details/127560241