android 的消息机制

本文深入解析Android消息机制,重点介绍Handler、Looper、MessageQueue的工作原理及其在UI更新和子线程间通信中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    android的消息机制主要是指Handler的运行机制。 

MessageQueue:消息队列,采用单链表的数据结构来存储消息队列

Looper:队列循环,会以无限循环的形式去查找是否有新消息,如果有新消息就处理,否则就一直等待着

ThreadLocal:每个线程中存储数据的,通过ThreadLoacl可以轻松获取每个线程Looper

注意:线程默认是没有Looper的,如果需要使用Handler就必须为线程创建Looper。我们经常提到UI线程(主线程),就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。

MessageQueue,Looper,ThreadLocal 这三者是一个整体。

*android 规定访问UI只能在主线程中进行。android又建议不要在主线程中进行耗时操作。 

handler的一个主要作用,将一个任务切换到某个具体的线程中执行。 解决在子线程中无法访问UI的矛盾。 

 

handler的工作原理:

     handler创建完毕之后,Looper和MessageQueue就可以和handler一起工作了,然后通过handler的post方法将一个

Runnable投递到Handler内部的Looper中去处理,也可以通过Handler的send方法发送一个消息,这个消息同样会在Looper中处理,其实post最终也是通过send方法来完成的,接下来看下send方法的工作过程。

          当handler的send方法被调用时,它会调用MessageQueue的qnqueueMessage方法将这个消息传到MessageQueue(消息队列)中,然后Looper发现有新消息到来时,就会处理这个消息,最终消息中的 Runnable或者 Handler的handlerMessage方法就会被调用。

注意:Looper是运行在创建Handler所在的线程中,

 

android的消息机制就是Handler的运行机制。

ThreadLocal

ThreadLocal的奇妙之处,不同线程访问这一个对象,能得到不同的结果(不同的线程中设置了不同的结果),

ThreadLocal 为什么做到互不干扰, 因为 ThreadLocal访问的是各个Thread (线程中的数据) ,

消息队列

消息队列包括两部分,插入和读取分别对应 enqueueMessage 和next ,单链表数据结构来维护数据列表。

Looper(循环)

消息循环的角色,它会不停的从MessageQueue中查看是否有新消息,如果有新消息就会立刻处理,否则就会一直阻塞在那里。

hander的工作需要Looper,没有Looper的线程就会报错。

Looper最重要的方法,只有调用了 loop后,消息循环系统才会真正的起作用。 

Handler

handler的工作主要包含消息的发送和接收过程。

消息的发送:post一系列方法;send的一系列方法(handler的发送消息就是向消息队列插入一条消息,MessageQueue的next

方法就会返回这条消息给Looper,Looper收到消息后就开始处理了,最终消息由Looper转交个Handler,)

消息的接收:handlerMessage( )

注意:在没有Looper的子线程中创建handler会引发程序异常。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值