文档章节

Handler,Message,Looper的关系

k
 kim366
发布于 2016/05/13 19:15
字数 944
阅读 4
收藏 0
Android系统中,Java的应用程序和其他的系统相同,都是靠消息驱动工作的,大致的工作原理是:
      有一个消息队列,可以往这个消息队列中投递消息。
      有一个消息循环,不断从消息队列中取出消息,然后处理。


在Android系统中,这些工作主要是由Looper和Handler类来实现。
      Looper类,用于封装消息循环,并且有一个消息队列。
      Hanlder类,有点像辅助类,它封装消息投递,消息处理等接口。


Looper类分析
      在线程中有一个线程局部变量类,调用Looper的prepare()方法,会在线程的局部变量类中设置一个Looper对象。这个Looper对象就保存在这个调用线程的TLV中。而Looper对象内部封装了一个消息队列。也就是说,prepare函数通过ThreadLocal机制,巧妙地把Looper和调用线程关联在一起了。


Looper循环
      Looper类有一个myLooper()方法,调用这个方法,可以返回调用线程的线程局部


变量,也就是存储在其中的Looper对象   。
      loop()函数内部的处理过程为:
     1. 调用myLooper方法返回保存在调用线程TLV中的Looper对象。
     2. 取出这个Looper的消息队列。
     3. 处理消息,Message对象中有一个target,它是Handler类型。

     4. 如果target为空,则表示需要退出消息循环,否则,调用该消息的Handler,交给它的dispatchMessage函数处理。

简单理解,Looper的作用是:

     1. 封装一个消息队列。
     2. Looper的prepare函数把这个Looper和调用prepare的线程(也就是最终的处理线程)绑定在一起了。
     3. 处理线程调用loop函数,处理来自消息队列的消息。
         当事件源向这个Looper发送消息的时候,其实是把消息加入到这个Looper的消息队列里面。那么该消息就将和Looper绑定的处理线程来处理。


Looper,Message和Handler的关系
      Looper中有一个Message队列,里面存储的是一个个待处理的Message。
      Message中有一个Handler,这个Handler是用来处理Message的。


Handler分析
      Handler中的消息队列,实际上就是某个Looper中的消息队列。
      如果不知道Handler,怎么往Looper的消息队列中插入消息。
     1. 调用Looper的myQueue,它将返回一个消息队列对象MessageQueue。
     2. 构造一个Message,填充它的成员,尤其是target变量。
     3. 调用MessageQueue的enqueueMessage,将消息插入消息队列。


Handler和Message
      Handler提供了一系列函数帮助我们完成创建消息和插入消息队列的工作。 
      用Handler处理消息时,Handler把Message的target设为自己,是因为Handler除了封装消息添加等功能外还封装了消息处理的接口。


Handler的消息处理
      往Looper的消息队列里添加一个消息后,按照Looper的处理机制,它在获得消息后会调用target的dispatchMessage函数,再把这个消息派发给Handler处理。
      dispatchMessage定义了一套消息处理的优先级机制
      1. Message如果自带了callback处理,则交给callback处理。
      2. Handler如果设置了全局的mCallback,则交给mCallback处理。
      如果上述都没有,则该消息会被交给Handler子类实现的handleMessage来处理。当然,这需要从Handler派生并重载handleMessage函数。


Looper和Handler的同步关系 
      在一个线程中创建Looper,在另一个线程中去取这个Looper的值,可能Looper还没来得及创建,这个时候去取,则会得到null值。
      这个问题可以通过使用HandlerThread来解决。

本文转载自:http://blog.csdn.net/oyangyujun/article/details/47300831

k
粉丝 1
博文 129
码字总数 0
作品 0
朝阳
私信 提问
Android线程管理(一)——线程通信

线程通信、ActivityThread及Thread类是理解Android线程管理的关键。 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用。本小节主要从以下...

yhthu
2017/05/17
0
0
android开发笔记:Handler、Looper、MessageQueen、Message的关系

一、什么是handler? 注:线程分为主线程(主线程又叫UI线程,只能有一个主线程)和子线程(可以有多个)Handler只能在主线程里运行 handler是Android给我们提供用来更新UI的一套机制,也是一...

火牛视频
2018/08/24
0
0
Android Looper,Handler,Message分析

Looper Looper的构造方法是private的,不可以在外部生成Looper的实例. 最重要的几个变量: ThreadLocal :静态的,保存所有线程及其所关联的Looper实例.可以理解为这是一个Map,保存了线程-...

linsea
2014/01/28
262
0
android基础知识02——线程安全3:Message,MessageQueue,Handler,Looper

android的UI操作不是线程安全的,同时也只有主线程才能够操作UI,同时主线程对于UI操作有一定的时间限制(最长5秒)。为了能够做一些比较耗时的操作(比如下载、打开大文件等),android提供...

迷途d书童
2012/03/23
775
0
Android系统消息分发体系

Handler、Looper、Message、MessageQueue之间的关系(基于Android API 26) 安卓系统设计的消息分发体系,不仅在应用层广泛应用;而且在底层也是使用这个体系,与Binder一起进行消息分发,因...

liuzxgeek
2018/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
39分钟前
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
40分钟前
7
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
43分钟前
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
49分钟前
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部