首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Handler消息传递与处理机制和实现原理

在Android开发的多线程应用场景中,Handler十分常用,主要用作多线程通信。要弄清楚传递与处理机制就需要了解HandlerMessageMessageQueenLooperThreadLocal这几个概念和整个流程。

相关概念

Handler - 消息的真正处理者, 具备获取消息、发送消息、处理消息、移除消息等功能;

Message -代表一个行为what或者一串动作Runnable的消息,每一个消息在加入消息队列时,都有明确的目标Handler;

MessageQueue - 以队列的形式对外提供插入和删除的工作, 其内部结构是以双向链表的形式存储消息的;

Looper - 是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理;

ThreadLocal - 是线程本地存储区(TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用,每一个线程有他自己所属的值(线程隔离)。

整个流程

Handler通过sendMessage()发送Message到MessageQueue队列;

Looper通过loop(),不断提取出达到触发条件的Message,并将Message交给target来处理;

经过dispatchMessage()后,交回给Handler的handleMessage()来进行相应地处理。

注意:每个线程默认是无Looper的,在一个线程中使用Handler来收发消息时,需要先调用Lopper.prepare()进行创建对应的Looper,创建Handler后需要调用Looper.loop()来开启消息循环。一个线程只能有一个Looper,对应的只有一个MessageQueue。

问:为什么主线程不会因为Looper.loop方法造成阻塞?

答:因为Android 的是由事件驱动的,Looper.loop() 不断地接收事件、处理事件,每一个点击触摸或者说Activity的生命周期都是运行在 Looper.loop() 的控制之下。所以不存在主线程会被Looper.loop方法阻塞。如果 Looper.loop()被干掉了,应用也就挂掉了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200914A0B1OJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券