Handler机制简介
Handler是android中最重要组成部分之一,Handler机制可以看做是一个消息阻塞队列,APP启动后很快就进入死循环(while循环),不断的读取消息队列中的消息,每个线程最多只有一个消息队列,没有消息时就阻塞,有就立马执行。所有消息排队执行,因为是一个线程,所以同时只能执行一个消息。android的view绘制,事件响应(点击,触摸屏幕等)都是把消息发送到了主线程的消息队列,等待android APP的执行(这点可以通过手动抛出异常查看错误堆栈来验证)。包括自己在主线程new 的handler最终也是把消息插入到了主线程消息队列中。从以上来看android主线程大部分时间是空闲的。当点击屏幕后手机能立马响应也可以看出android主线程大部分时间是空闲的。虽然主线程要处理的事情狠多,很杂,很琐碎(view布局、绘制,事件分发等等),但处理时间都很短暂,可以保证很快处理完毕,然后等待下一个消息的到来。android handler机制简可以实现所有view相关的操作都在主线程进行,从而避免了使用 锁 。具体实现代码 如下。
java工程实现Handler机制代码
下面的代码跟android的handler机制主要原理完全一致,但不依赖android系统。
|
运行结果
|
Handler代码
|
Looper代码
|
MessageQueued代码
|
ThreadLocal简单实现
ThreadLocal内部原理和下面实现方式不同,但达到的效果是相同的,本篇主要介绍Handler机制,简化了ThreadLocal
|
Message代码
|
以上就是android Handler机制原理代码了。
android还提供了HandlerThread,其实是对Handler和Thread的封装。
先看一下HandlerThread使用方式
|
每次new HandlerThread都会创建一个新线程,当我们使用myHandler发送消息时消息就会在HandlerThread线程执行。HandlerThread线程内部也是一个死循环,通常不会退出,当通过myHandler为其发送消息时就会从阻塞中醒来执行消息,执行完消息队列里的消息后就又阻塞。HandlerThread可以排队执行消息,保证能按加入消息的先后顺序执行。比如我们需要压缩很多图片时,就可以使用HandlerThread,主线程直接把图片通过myHandler发送到HandlerThread,HandlerThread就可以执行图片压缩,所有压缩任务都按添加顺序依次执行。
来自我的博客
http://blog.csdn.net/qingchunweiliang/article/details/50448365