我们从开发的角度来说,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运行机制的更多相关文章

  1. Android Native -- Message/Handler/Looper机制(原理篇)

    ⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...

  2. Android Native -- Message/Handler/Looper机制(应用篇)

    ⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...

  3. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  4. 使用过AsyncTask、EventBus、Volley以及Retrofit,必须好好了解handler运行机制

    我们都知道在UI线程中不能进行耗时操作,例如数据读写.网络请求.Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadExceptio ...

  5. Android中的Handler的机制与用法详解

    概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍ha ...

  6. 转:Android中的Handler的机制与用法详解

    注:Message类的用法: message的几个参数都可以携带数据,其中arg1与arg2可以携带int类型,what是用户自定义的int型,这样接受者可以了解这个消息的信息. 说明:使用Messa ...

  7. Android学习之Handler消息传递机制

    Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...

  8. Handler运行机制

    https://blog.csdn.net/u012827296/article/details/51236614

  9. Android应用开发学习笔记之多线程与Handler消息处理机制

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...

随机推荐

  1. 【AutoFac】依赖注入和控制反转的使用

    在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...

  2. Java开发笔记(二十四)方法的组成形式

    经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...

  3. springboot、springsecurity、jwt权限验证

    1.背景 基于前后端分离项目的后端模块: 2.相关技术 springboot全家桶 web模块 security模块:用于权限的验证 mongodb 模块:集成mogodb模块 jwt 用于token ...

  4. Spring中BeanFactory的对象注册与依赖绑定方式

    概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将 ...

  5. 关于我的博客(About My Blogs)

    本文算是第一篇文章,记录工作/学习/生活中的觉得值得分享的东西 When,Where,Who,What,How,Why,尽可能每篇博文当作一个事件来描述. 也就是触发想写这篇文章的事件. 要坚持下来写 ...

  6. Nginx基础知识

    1.nginx正向代理.反向代理 正向代理: 在如今的网络环境下,如果由于技术需要要去访问国外的某些网站,此时会发现位于国外的某网站通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问, ...

  7. Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录

    本人微信公众号:微软动态CRM专家罗勇 ,回复298或者20190120可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 系统 ...

  8. SAP MM 根据采购订单反查采购申请?

    SAP MM 根据采购订单反查采购申请? 前日微信上某同行发来一个message,说是想知道如何通过采购订单号查询到其前端的采购申请号. 笔者首先想到去检查采购订单相关的常用报表ME2L/ME2M/M ...

  9. alibaba fastjson 使用

    // 对象转 json 字符串 User user1 = new User("Marry", 30, new Date()); String str1 = JSON.toJSONS ...

  10. 常用weblogic搜索关键字

    NOTE:876004.1 - How to Apply WebLogic Server (WLS) Patches Using Smart Update [Video]NOTE:942815.1 - ...