我们从开发的角度来说,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. Odoo POS会员积分当钱用如何设置?

    问题提问 设定积分规则1元积1分.而后每1积分可以当1分钱用,POS中能处理吗? 解决方案 1) 设定服务类型产品“积分”,其单价为0.01,收入科目为“销售费用” 2) 设定积分计划:积分规则是,订 ...

  2. Python使用Plotly绘图工具,绘制散点图、线形图

    今天在研究Plotly绘制散点图的方法 使用Python3.6 + Plotly Plotly版本2.0.0 在开始之前先说说,还需要安装库Numpy,安装方法在我的另一篇博客中有写到:https:/ ...

  3. selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见

      http://wiki.hudson-ci.org/display/HUDSON/Tomcat Tomcat from Windows GUI Testing in Windows Most Wi ...

  4. mysql使用索引的注意事项

    使用索引的注意事项 使用索引时,有以下一些技巧和注意事项: 1.索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索 ...

  5. Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法

    通常项目上线前都有一些初始化数据需要导入,在今天博客系统发布前我使用sqlyog工具远程登录服务器的Mysql数据库,执行sql脚本对初始数据进行导入的时候报错: Got a packet bigge ...

  6. python粗谈面向对象(一)

    1.面向过程编程vs函数式编程 面向过程编程 以计算对象的元素个数为例. str_1 = 'abcdefg' count = 0 for i in str_1: # 统计字符串元素个数 count + ...

  7. eos 创建两对的公钥和私钥, 钱包,交易所转账到主网,主网到交易所

    在ubuntu18.04上安装EOS的目的: 在ubuntu中,进行eos源码编译和安装 在不联网的安全环境下,用eos官方的命令行工具,创建自己的公钥和私钥 用eos官方的命令行工具,创建钱包,执行 ...

  8. 连接到github

    1,创建秘钥 $ ssh-keygen -t rsa -C "youremail@example.com"执行成功后,会在~/.ssh/目录下生成id_rsa和id_rsa.pub ...

  9. python3操作MySQL数据库,一次插入多条记录的方法

    这里提供一个思路,使用字符串拼接的方法,将sql语句拼接出来,然后去执行: l = ["] s = '-' print(s.join(l))

  10. win8.1 AMD 屏幕亮度无法调整

    lenovo z465  AMD处理器. win8.1 pro系统   屏幕亮度无法调整解决办法:   1:当然是先去本地服务里禁用"Sensor Monitoring Service&qu ...