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类有多个构造函数,一般通 ...
随机推荐
- 通过拼接SQL字符串实现多条件查询
一.通过拼接SQL字符串的方法的好处是: 1.方便查询条件的扩展. 2.简化业务逻辑的判断. 二.例子: 1.界面设计 2.点击查询的代码 /// <summary> /// 按条件查询 ...
- Java学习笔记 抽象类 接口 多态
instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...
- 【开源】SpringBootNetty聊天室V1.2.0升级版本介绍
前言 SpringBoot!微服务微架构的基础,Netty通信框架的元老级别框架,即之前的SpringBoot与Netty的实现聊天室的功能后已经过了不到一周的时间啦,今天我们更新了项目版本从V1.0 ...
- C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的 ...
- 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY
摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...
- html/css的学习之路(1)
HTML5简介:HTML5是什么?要回答这个问题,我们需要先了解一下HTML是什么.HTML的英文全称为Hyper Text Markup Language,即超文本标记语言.HTML5是HTML的一 ...
- 字符串hash入门
简单介绍一下字符串hash 相信大家对于hash都不陌生 翻译过来就是搞砸,乱搞的意思嘛 hash算法广泛应用于计算机的各类领域,像什么md5,文件效验,磁力链接 等等都会用到hash算法 在信息学奥 ...
- matlab练习程序(神经网络识别mnist手写数据集)
记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对. 这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码. mnist数据集训练数据一共有28*28*60000个像素 ...
- FormData 对象上传二进制文件
使用jQuery 利用 FormData 上传文件:http://harttle.com/2016/07/04/jquery-file-upload.html 通过FormData对象可以组装 ...
- spring学习总结——高级装配学习二(处理自动装配的歧义性)
我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...