android handle 阻塞,Android中handler机制原理详解

本文详细解析了Android中Handler的运作机制,包括其作用、架构和原理。Handler用于在不同线程间切换任务执行,依赖于MessageQueue和Looper。Looper不断检查MessageQueue是否有新消息并执行,若无消息则会阻塞。Handler发送消息到MessageQueue,Looper循环处理消息,确保主线程不被阻塞。文章还讨论了主线程中Handler的使用、死循环与ANR的关系,以及如何确保延时消息的精确执行。
摘要由CSDN通过智能技术生成

1、handler的作用

handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。

2、handler的架构

Handler的运行需要底层的 messagequeue和 looper做支撑。

3、handler原理

3 .1 、首先说messagequeue,messagequeue 是 一 个 消 息 队 列 , 它是采用单链表的数据结构来存储消息的,因为单链表在插入删除上 的效率非常高。(Meaasgequeue主要包含一个是插入消 息的 enqueuemessage方法,和一个取出一条消息的next方法。)

3.2、然后说 looper,looper在安卓的消息机制中是扮演着消息调度的角色,具体来说就是他会不停的从 messagequeue中查看 是否有新消息,如果有,并且这个消息需要执行,就从队列中取出这个消息进行执行,(死循环遍历消息:取消息的线程会先阻塞一段时间(队头消息的执行时间减去当前时间),然后从队列中取出队头消息),否则会一直阻塞在messagequeue的next那里。(构成 一个 looper是需要一个 messagequeue,而构成一个 handler则需 要一个 looper,)另外looper一般是调用Looper.prepare()方法使用 threadlocal在线程的ThreadLocalMap中存储一个looper的,线程中有了looper之后就可以在这个线程中创建一个 handler了。

3.2、然后说 looper,looper在安卓的消息机制中是扮演着消息调度的角色。

Looper取消息的过程是这样的:

如果队列中有消息:

1、判断队头消息的执行时间是否大于当前时间,如果大于,就调用nativePollOnce阻塞一段时间(队头消息的执行时间-当前时间)然后取出队头消息进行执行。

2、否则就立即取出队头消息进行执行。

3、如果队列中没有消息,就一直阻塞,直到下一个消息来到,才唤醒取消息的线程继续上述循环。

Message next() {

final long ptr = mPtr;

if (ptr == 0) {

return null;

}

int pendingIdleHandlerCount = -1; // -1 only during first iteration

int nextPollTimeoutMil

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值