Android Handler机制的一些深入探讨

目前对于我们来说,Handler是一个非常常用,也非常好用的一个机制.

1 可以将耗时的操作,放在子线程中执行

2 Handler本身使用了Linux下的epoll机制,这样可以阻塞线程.不再占用CPU资源

是不是非常NICE,既可以执行各种耗时任务,还会执行完自行进入阻塞,释放CPU资源.最主要的是这一切的发生都是在应用层看起来非常简单的调用.

Handler内部的初始化最后都会调用该方法实现,首先实现的便是 mLooper = Looper.myLooper();

而每个应用创建的同时,都会创建一个主线程ActivityThread,而在起main函数中会调用

进而完成主线程的Looper的相关初始化操作,也就是说,我们在应用中使用handler无指定的Looper的情况下,都是使用

mainLooper的looper来使用的.

到目前为止Handler 与 Looper的联系可以说建立起来了

下一步我们分析一下Looper的一些内部具体有趣的实现.

其中java端Looper.java只是提供了一些静态方法,以及创建了一个ThreadLocal,ThreadLocal是一个线程内部数据存储类

主要保证,每个进程访问的Looper传递的都是改进程内的数据,毕竟系统中运行的Looper很多.

system/core/libutils/Looper.cpp 则是完成整个循环体系的重点,不过这时候我们需要先转到Handler中

Handler的sendMessage()方法最后的调用实现是在

这里面就引入了一个非常重要的类MessageQueue.java

MessageQueue.java重点分两个部分,一个是他的native方法.也是整个系统核心.

一个是他的next()方法以及enqueueMessage方法用来发送消息,会判断是否需要唤醒线程调用nativeWake去唤醒当前线程

现在我们转到android_os_MessageQueue.cpp JNI中这里可以看到引入的Looper.h 包是在utils包中.

这里面有两个重要办法一个是pollOnce 就是往Looper中发送消息,一个是wake()方法唤醒

接下来转到Looper.cpp中利用linux的epoll机制来做事件驱动唤醒线程...暂时先不做分析了..

整个Handler体系还有一个重要的Message类.这个类更多的是一个Entry对象.主要是提供各种对象供整个体系做数据传递

Message中有个 Message next对象,主要用来在MessageQueue中实现类似单链表这种数据结构的实现.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值