Android 上的应用类似于 Win32 的消息处理机制,也是由消息驱动来工作的。也是会涉及到消息,消息队列,消息循环,以及处理消息的应用层上的消息处理器。

下图为 Looper, Handler, Message, MessageQueue 之间的静态关系

下面会对几个相关组件逐步深入学习了解,先从 消息循环 Looper 开始 了解整个消息的处理流程,并在这个过程中逐步深入了解其他的组件。

Looper 主要封装了消息循环(loop方法),且维护了相关联的消息队列,结合上图以及Looper的实现源码可以看到 mMainLooper 就是 Looper 的一个静态实例,是存在于应用的主线程中的,当然我们也可以通过 Looper 的 prepare 和 loop 创建一个自己的 Looper,如下实例:

class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler() {public void handleMessage(Message msg) {// process incoming messages here}};Looper.loop();}
}

在应用中可以如下启动 Looper Thread:

new LooperThread().start();

这里其实也就是启动一个执行 LooperThread.run() 的新线程,下面分析一下里面的两个Looper的关键调用prepare和loop,也是从 loop 开始了消息循环。

1) Looper.prepare

public static void prepare() {// 这里就限制了一个线程内只能 prepare 一次if (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}// 构造一个 Looper 对象,并设置到调用线程的线程局部变量中sThreadLocal.set(new Looper());
}

再来看 prepare 中 new 出来的 Looper 实例的构造:

private Looper() {mQueue = new MessageQueue();mRun = true;mThread = Thread.currentThread();
}

首先它是一个 private,也就限制了外部只能通过 prepare 来创建 Looper,也进一步确保一个线程内只能有一个 Looper 对象。

另外,看到了此处创建了消息队列,并得到了该 Looper 所属的 thread。

转载于:https://blog.51cto.com/quietmadman/1282250

Android Handler 深入学习(1)相关推荐

  1. Android 系统(189)---Android Handler:这是一份 全面、详细的Handler机制 学习攻略

    Android Handler:这是一份 全面.详细的Handler机制 学习攻略 前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将献上一份 全面.详细的Handl ...

  2. android面试 handler,Android面试之Handler相关学习

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ###Android面试之Handler相关学习 1.Android消息机制之Looper.java源代码学习 1). ...

  3. Android Handler介绍

    本文转自:http://www.cnblogs.com/keyindex/articles/1822463.html 前言 学习android一段时间了,为了进一步了解android的应用是如何设计开 ...

  4. epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?

    介绍一下 Android Handler 中的 epoll 机制? 目录: IO 多路复用 select.poll.epoll 对比 epoll API epoll 使用示例 Handler 中的 e ...

  5. android Handler的使用(一)

    Handler的使用(一) Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出 ...

  6. Android开发基础学习总结

    最近一直在学习安卓开发,主要从安卓的基础组件,布局,Activity学起,也是边学习边整理笔记,希望可以给需要帮助的人解决能解决掉的问题,以后也会慢慢更新的. 一.Android布局 1.Androi ...

  7. Android基础知识点学习总结

    Android基础知识点学习总结 安卓基础知识个人学习笔记分享~ 一.Android系统架构 Linux内核层→系统运行层→应用框架层→应用层 1.Linux内核层:Android系统是基于Linux ...

  8. 2021年超详细的-Android超神学习路线总结--纯干货分享(字节,阿里,腾讯大牛联合打造)

    前言 2021年秋招没有找到满意工作的童鞋,考研结果不理想的童鞋,留学生回国的童鞋们,都开始准备2021年的春招了,如果想从事Android开发工作,可以参考本文. 本文整理了Android开发的学习 ...

  9. android源码学习-Toast实现原理讲解

    前言: 前些日志QQ群有朋友发了一个Toast的崩溃日志.Toast如此简单的用法怎么会崩溃呢?所以顺便就学习了一下Toast在源码中的实现,不算复杂,但内容挺多的,这里就来分享一下,方便读者. 一. ...

最新文章

  1. 20年来最不靠谱的五大互联网预言
  2. 11.C++: cin、cin.get()、cin.getline()、getline()、gets()
  3. linux检测文件名编码,Linux下查看文件编码,文件或文件名编码格式转换 | 缥缈的云...
  4. css类选择器优先级 大于 标签选择器
  5. python json dumps utf8_Python2操作JSON出现乱码的解决方案
  6. Android之layout属性介绍
  7. pytorch图像和张量的相互转换_Day107:Pytorch张量类型的构建与相互转换
  8. Java中的关键字@Override解释
  9. c# 溢出抛异常_C#中的int是否没有溢出异常?
  10. css matrix矩阵,矩阵 | matrix() (Transforms) - CSS 中文开发手册 - Break易站
  11. 屏幕共享软件开发_工作生活离不开软件,你知道什么是免费软件与共享软件吗?...
  12. 【优化算法】蜻蜓算法(DA)【含Matlab源码 1306期】
  13. Http协议详解(深入理解)
  14. 科创板第二批受理名单公布,为何AI独角兽 “全军覆没”?
  15. Leetcode 刷题 - 排序(day4)_颜色排序
  16. 2, 世界上第一台电子数字计算机叫什么?它诞生在哪个国家?,世界上第一台电子数字,计算机叫什么名...
  17. 各代DDR内存的速度表
  18. C++写一个CSGO开箱模拟器
  19. Echarts-gl geo3D设置regions区域高度
  20. 安卓ImageView镜像翻转

热门文章

  1. Redis 为什么这么快?
  2. 如何一小时杀入天池OCR比赛前排?
  3. 数据分析之Pandas合并操作总结
  4. 数据挖掘入门指南!!!
  5. 日读论文100+,AI都替代不了!辞去医药研发总监后,她成为了一名全职学术警察...
  6. Flask之Cookie与Session
  7. python之互斥锁
  8. Scrapy框架的入门使用
  9. 医 系统 springboot搜索到的spring boot 的javaweb项目
  10. 理解透彻--802.1d,802.1w,802.1s与802.1q