Handler消息机制

Handler解决线程间通信

Handler异步通信系统

Handler机制主要的几个角色:HardlerMessageLooperMessageQueue

主线程在一开始就建立了这么一套系统


Hardler:子线程和主线程之间交互 (发送和处理消息)

Message

Looper:承担了主线程定时查看自己MessageQueue邮箱的一个任务。(取消息的角色)是个死循环,是一直不会退出去的(“心跳机制”)

消息循环 管理消息
不断去消息队列里判断有没有相应的消息
一旦发现有消息就将消息拿出来,给到 Handler

MessageQueue :(保存消息的一个队列)相当于是一个中转站,子线程要是想给主线程发送消息,就将消息发送到MessageQueue中,主线程会定期检查MessageQueue中有没有消息

Handler 调用 handleMessage 方法,处理任务

Hardler.png Handle工作流程.png

Handler多线程通信机制

子线程要想给主线程发送消息,首先要拿到主线程里的Handler,用主线程的Handler给主线程发消息,调用SendMessage,经过上图中的流转。主线程从消息队列中拿到消息,交给自己,调用handleMessage方法,就可以收到消息了

Handler多线程通信机制.png

Handler源码分析

1
2
3
4
5
6
7
8
//一旦初始化之后就不可修改
final Looper mLooper;
final MessageQueue mQueue;


//Handle的一个构造函数中
mLooper = Looper.myLooper();
mQueue = mLooper.mQueue;

MessageQueue的数据结构

main函数执行完之后就会退出,但是在安卓中,如果用户不主动退出,Activity将一直保持运行状态。这就是因为,在Looper内部,维护着一个无限循环,它保持app进程能够在这个死循环里面持续进行。(“心跳机制”)

线程如何跨越内存管理那些事儿

面试:谈谈 Handler 机制和原理?

首先在UI线程我们创建了一个Handler实例对象,无论是匿 名 内部类还是自定义类生成的Handler实例对象,我们都需 要对 handleMessage方法进行重写,在handleMessage方法中我们可 以通过参数msg来写接受消息过后UIi线程的逻辑处理,接着 我们创建子线程,在子线程中需要更新UI的时候,新建一个 Message对象,并且将消息的数据记录在这个消息对象 Message的内部,比如arg1,arg2,obj等,然后通过前面的 Handler实例对象调用sendMessge方法把这个Message实例 对象发送出去,之后这个消息会被存放于 MessageQueue中等待被处理,此时MessageQueue的管 家 Looper正在不停的把MessageQueue存在的消息取出 来,通 过回调dispatchMessage方法将消息传递给Handler

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信