作者:milter
链接:https://www.zhihu.com/question/19703357/answer/107984017
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、google为什么设计这套机制

主要是为了解决在非UI线程中更新UI组件比较麻烦的问题。

二、google如何实现这套机制

UI线程中有一个线程专属的Looper对象,它负责安排所有准备在UI线程上执行的代码。这里有两点技术:实现UI线程专属的Looper对象用到了java的ThreadLocal技术,想深究请直接看ThreadLocal源码,不难,真心不难,当然不看也行,只要知道有这么回事也够,需要时再看。Looper对象通过消息机制接受系统或者应用的其他线程提交的准备在UI线程上执行的代码。提交方式是:以该Looper对象为参数创建一个Handler对象,也可以在UI线程中无参数构建一个Handler对象,此时的Handler对象直接就与UI线程的Looper对象绑定。Handler对象负责向Looper对象提交代码。最直接的提交方法是调用Handler对象的post方法,该方法的参数是一个Runnable对象,代表了要在UI线程上执行的代码。这样的方法简单但是没法传递数据给要执行的代码,因为构造Runnable对象是没有参数的。为此,google提供了另一种提交代码的方法,就是让Handler对象发送一个消息给Looper对象,这个消息中可以包含一定的数据(消息的what域和obj域就是用来包含数据的),要执行的代码就是Handler中的handleMessage方法,该方法会收到发送给Looper的消息,进而可以从中取出数据再执行代码。

以上为原理。

三、一些可以帮助理解原理的细节

因为Looper是给UI线程安排代码的,所以一个UI线程只能有一个Looper对象,否则多个Looper对象都要在UI线程上安排代码,解决冲突就是个大难题。因为Looper对象是线程专属的,所以一个Looper也只能对应一个UI线程。二者是一对一的关系。但是一个Looper对象可以有多个Handler对象向它提交代码,这并不会引起代码冲突。因为Looper对象会线性安排在UI线程上待执行的代码,它通过一个队列管理各个Handler对象提交的代码。Looper对象安排执行代码靠的是它的loop方法。

四、具体使用方法

将一个与UI线程上Looper对象关联的Handler对象传给其他线程,其他线程通过这个对象向UI线程上提交代码。

五、该机制的一般性扩展

实际上,可以为任意一个线程创建一个唯一的Looper对象,这是通过Looper类的静态方法prepare实现的,然后可以用这个Looper对象创建一个或多个Handler对象,然后就可以用这些Handler对象向该线程提交执行代码了,google提供了一个HandlerThread类,就是一个已经实现好了Looper对象的Thread,方便你的使用。

如果觉得本文对你有所帮助,希望不要吝惜你的大拇指,给点个赞。

handle 机制的原理是什么的更多相关文章

  1. Handle机制的原理

    Android提供了Handle和Looper来满足线程间的通信.Handle先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange). 1.Looper: ...

  2. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

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

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

  4. logrotate机制与原理[转载]

    http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息.通过日志可以分析用户行为,记录运行轨迹,查找程序问题.可惜磁 ...

  5. Android(java)学习笔记202:Handler消息机制的原理和实现

     联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系   1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...

  6. Java序列化的机制和原理

    Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...

  7. Java序列化机制和原理及自己的理解

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  8. Session执行机制与原理

    Session执行机制与原理 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 什么是Session 首先了解一下Session的中文意思:一次会话,什么是一次会话呢?我举个例子:就我们现 ...

  9. Qt核心机制与原理

    转:  https://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★ ...

随机推荐

  1. CF678D(Iterated Linear Function)

    题目链接:传送门 题目大意:略 题目思路:用题目所给函数推出表达式,然后用等比求和公式得到关系式套用即可(需用乘法逆元),也可直接构造矩阵,用矩阵快速幂求解. 感受:做题时一定要仔细,需要仔细注意什么 ...

  2. _heap_alloc_base 奔溃,奔溃原因:堆被破坏

    现象:程序崩溃的地方比较随机,之前没问题的代码, 可能直接奔溃,多线程下其他地方堆栈被破坏,引起崩溃的时间是不定,所以在其他地方随机性奔溃 检测方法:使用windows工具gflags.exe 开启 ...

  3. mysql 使用命令执行外部sql文件

    语句 source e:\\phpPro\\fileName.sql 注意,不需要再后面加  分号  !!!!!

  4. flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array

    mkdir /data/UnifiedLog/; cd /data/UnifiedLog/; wget http://mirror.bit.edu.cn/apache/flume/1.8.0/apac ...

  5. docker在团队中的实践 How To Install Docker In CentOS

    " 预发布机器(centos-6.5),给每个同学都开通了ssh这个机器是大家一起共用的,稍后导些数据下来.后续 项目上线,产品测试,都是在这上面进行.  目前在一个物理机 " 3 ...

  6. pycharm-->github / github-->pycharm

    一.pycharm -->发布到--> github:1.github 账号密码 https://github.com/2.git 下载安装 https://git-scm.com/3.配 ...

  7. 二.数据库游标对象cursor与实例

    1.数据库游标对象cursor 2.select实例 代码展示: import pymysql conn=pymysql.connect( host='192.168.199.249', port=3 ...

  8. 棣小天儿的第一个python程序

    根据给定的年月日,以数字形式打印出日期 months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'Augu ...

  9. Android主页导航:fragment+viewpager

    简单实现Fragment+ViewPager实现主页导航控制,效果如下: 一.activity_main.xml布局文件: <?xml version="1.0" encod ...

  10. ionic3使用echart插件

    安装 看官方文档可以知道ECharts可以在webpack中使用看这里,故我们可以使用npm下载安装到项目中 npm install echarts --save //下载ECharts npm in ...