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类有多个构造函数,一般通 ...
随机推荐
- ElasticSearch-6.2安装head插件
环境 Windows10企业版X64 JDK-1.8 ElasticSearch-6.2.4 node-v10.1 git客户端 步骤 安装node到K盘.如K:\nodejs. 把NODE_HOME ...
- Java开发笔记(八十)利用反射技术操作私有方法
前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用.为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get** ...
- WEB 实时推送技术的总结
前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...
- 纯css做幻灯片效果
css3里面有一个@keyframes动画功能. w3c上面的例子: 可以使用它来做一个幻灯片效果. <!DOCTYPE html> <html lang="en" ...
- Git命令备忘
最近在用Git,查了点相关资料,逻辑依然不太明了,先整理一部分备忘,以后补充 一.本地Git与Github/码云的关联 1. 设置本地用户名,邮箱 git config --global user.n ...
- [20190415]10g下那些latch是共享的.txt
[20190415]10g下那些latch是共享的.txt http://andreynikolaev.wordpress.com/2010/11/23/shared-latches-by-oracl ...
- MongoDB基础学习
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- c/c++ 继承与多态 子类隐藏父类的同名非虚函数
问题1:若类A里有公有成员方法int fcn(),类B公有继承类A,并类B里有公有成员方法int fcn(int),可以在用户代码里,用类B的对象调用类A的int fcn()吗?? 不可以,编译出错, ...
- Centos7安装搭建NTP服务器和NTP客户端同步时间
NTP简介: NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要 例如:对于火箭发射这种科研活动,对时间的 ...
- 目录命令(dir)
DIR 命令: // 描述: (Directory) 显示目录的文件和子目录的列表. // 语法: dir [<Drive>:][<Path>][<FileName> ...