目前对于我们来说,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中实现类似单链表这种数据结构的实现.