Android艺术——探究Handler运行机制
我们从开发的角度来说,Handler是Android 的消息机制的上层接口。说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI。没错,Handler的确是用于更新UI的,具体来说是这样的:有时我们需要在子线程中进行耗时的I/O操作,而在此操作完成后需要在UI上有所变化,在Android开发中,我们是不能够在子线程中访问UI控件的,这时我们的主角Handler就出场了,可以将更新UI的操作切换到主线程中执行。从中我们可以看出Handler并不是专门用于更新UI的,只不过经常被用来更新UI。
Handler的运行机制其实就是Android的消息机制,谈到Handler不得不说底层还需要MessageQueue和Looper的支撑;它们分别叫消息队列与消息循环,MessageQueue它是用于内部存储消息,并且以队列的形式对外提供插入和删除的工作,而内部结构是采用单链表的数据结构来存储消息列表。Looper和消息队列有关,MessageQueue只是个存储消息的单元,Looper则是无限循环的形式去查找是否有新消息。但是要注意的是线程中默认没有Looper的,如果需要使用Handler就必须为线程创建Looper。Handler的主要作用是将一个任务切换到某个知道的线程中执行。
系统之所以提供Handler的主要原因是为了解决在子线程中无法访问UI的矛盾,因此可以想到那么系统为啥不让子线程访问UI呢?UI控件不是线程安全的,好又有人会说上锁机制不就解决了,但是有没有想过加上锁机制以后会让UI的访问逻辑变得复杂,而且还有降低UI访问的效率原因是锁机制会阻塞某些线程的执行。
消息队列的工作:MessageQueue主要包含两个操作,插入与读取,对应的方法分别是enqueueMessage与next,由于消息队列是通过一个单链表的数据结构来维护消息队列的,因为单链表的在插入与删除上比较有优势,enqueueMessage方法实现主要操作是单链表的插入,next方法是一个无限循环的方法,如果消息队列中没有消息,那么next方法就会一直阻塞在这里,直到有新消息到来,next方法就会返回这条消息并且将其删除。
Looper的工作原理:在消息机制中扮演消息循环的角色,具体来说它会一直从MessageQueue中查看是否有新的消息,如果有新的消息就会立刻处理,没有就阻塞。我上文就有说明Handler的工作需要Looper,不然就会报错,线程中是默认没有Looper的,创建:Looper.prepare()就可以为当前线程创建一个Looper,然后用Looper.loop()来开启消息循环。而loop方法是一个死循环,唯一跳出循环的方式是MessageQueue的next方法返回null。
Handler的工作原理:主要包括消息发送与接收的过程。消息发送就是send,向消息队列插入一条消息,而MessageQueue的next方法就会返回这条消息给Looper,Looper收到后开始处理,最后消息会由Looper交给Handler处理,dispatchMessage方法调用。检查Message的callback是否为null,不是就通过handlerCallback来处理消息。最后Handler的handleMessage方法来处理消息。

Android艺术——探究Handler运行机制的更多相关文章
- Android Native -- Message/Handler/Looper机制(原理篇)
⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...
- Android Native -- Message/Handler/Looper机制(应用篇)
⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- 使用过AsyncTask、EventBus、Volley以及Retrofit,必须好好了解handler运行机制
我们都知道在UI线程中不能进行耗时操作,例如数据读写.网络请求.Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadExceptio ...
- Android中的Handler的机制与用法详解
概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍ha ...
- 转:Android中的Handler的机制与用法详解
注:Message类的用法: message的几个参数都可以携带数据,其中arg1与arg2可以携带int类型,what是用户自定义的int型,这样接受者可以了解这个消息的信息. 说明:使用Messa ...
- Android学习之Handler消息传递机制
Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...
- Handler运行机制
https://blog.csdn.net/u012827296/article/details/51236614
- Android应用开发学习笔记之多线程与Handler消息处理机制
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...
随机推荐
- JS截取数字
Math是javascript的一个内部对象,该对象的方法主要是一些数学计算方法floor:下退 Math.floor(12.9999) = 12ceil:上进 Math.ceil(12.1) = 1 ...
- JavaScript大师必须掌握的12个知识点
既然你对这篇文章感兴趣,我想你应该是一位前端开发,也许你有一份不错的工作.自主创业甚至是一位自由从业者.不知你的前端技术如何,也许你是一位新手,亦或是一位资深开发. 如果你想让自己成为一个 JavaS ...
- 一个可以自动生成css样式的插件happycss
一直在页面写css, 重复写着样式,发现布局中,特别是h5,大量的样式都是margin,padding,width,height, 而,当我们需要给一个标签写样式的时候,避免内联样式,我们又需要取cl ...
- Android为TV端助力 集成第三方播放器,实现全屏播放
下面这Demo链接:Android实现全屏播放,各种格式支持直播,点播,不收费!
- gitbook 入门教程之实用插件(新增3个插件)
插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...
- Linux中VSFTP的配置
配置VSFTP服务器: 1.安装VSFTP,可以参考Linux 中yum的配置来安装: yum installvsftpd.x86_64 -y 2.修改SELinux: setenforce 0 查看 ...
- GCD多线程的一个全面的题目
GCD多线程的一个全面的题目
- Docker 启动,进入容器,查看log命令
1.启动一个容器 docker run -d -P training/webapp python app.py -d:让容器在后台运行. -P:将容器内部使用的网络端口映射到我们使用的主机上. 如果需 ...
- 使用mybatis操作AS400数据库
先简单说一下怎么使用[jt400.jar]连接AS400上的DB2数据库. ※ jt400.jar资源,如果有安装AS400客户端的话,参考IBM官网 ※ http://www-01.ibm.com/ ...
- Linux、CentOS7下JDK环境配置
Linux版本 1.上传JDK包至指定目录,并解压 tar -xzvf jdk-7u80-linux-x64.tar.gz 2.配置JDK环境变量 打开/etc/profile配置文件 vim /et ...