Handler消息机制(十):HandlerThread源码解析
作为Android开发者都知道在子线程中使用Handler必须要创建Looper,其实HandlerThread就是在线程中封装了Looper的创建和循环,不用我们开发者自己去创建它,下面我们来看看源码
源码
public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}/*** Constructs a HandlerThread.* @param name* @param priority The priority to run the thread at. The value supplied must be from * {@link android.os.Process} and not from java.lang.Thread.*/public HandlerThread(String name, int priority) {super(name);mPriority = priority;}/*** Call back method that can be explicitly overridden if needed to execute some* setup before Looper loops.*/protected void onLooperPrepared() {}@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}
可以看出它就是一个普通的线程,创建的时候设置优先级,我们来看看它的run方法,挑重点看
//创建looper,保存到ThreadLocal线程中Looper.prepare();synchronized (this) {//得到创建的LoopermLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();//启动循环Looper中的消息队列Looper.loop();
很简单,就是创建了Looper并且启动循环消息队列。
public Looper getLooper() {if (!isAlive()) {return null;}// If the thread has been started, wait until the looper has been created.synchronized (this) {while (isAlive() && mLooper == null) {try {wait();} catch (InterruptedException e) {}}}return mLooper;}
得到刚才创建的Looper对象。
public boolean quit() {Looper looper = getLooper();if (looper != null) {looper.quit();return true;}return false;}
释放Looper消息队列里的消息。
到此HandlerThread的源码就解析完了。
Handler消息机制(十):HandlerThread源码解析相关推荐
- 安卓 Handler 消息机制之Message源码
一 概述 1. Message是handler机制中消息传递的载体,主要用来规范化传输数据的格式. 2. 源码内容含几个部分: 2.1 操作数据相关:一些属性和操作属性的getter和setter方法 ...
- 安卓 Handler 消息机制之MessageQueue源码
首先,MessageQueue是属于底层类且它依附于创建他的Looper,除Looper外其他类无法单独创建他,如果要使用他,只能从Looper出获得. 下面将从几方面分析: 1. 消息队列存储原理 ...
- Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- 消息转发机制与Aspects源码解析
前言 最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码. 这类业务有一个特点,业务内容是对应整个App的,与对 ...
- Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析
文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...
- Spring源码深度解析(郝佳)-学习-Spring消息-整合RabbitMQ及源码解析
我们经常在Spring项目中或者Spring Boot项目中使用RabbitMQ,一般使用的时候,己经由前人将配置配置好了,我们只需要写一个注解或者调用一个消息发送或者接收消息的监听器即可,但是底 ...
- 覆盖式理解Android 消息处理机制(带源码解析)
转载自:https://www.jianshu.com/p/02962454adf7 Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,A ...
- android handlerthread 线程管理,Android多线程之HandlerThread源码解析
一.概述 先来了解一下HandlerThread的几个特性 HandlerThread继续于Thread,本身就是一个线程类 HandlerThread在内部维护了自己的Looper对象,所以可以进行 ...
- 【kubernetes/k8s源码分析】eviction机制原理以及源码解析
kubernetes v1.12.1 What? kubelet 驱赶的是节点上的某些 Pod,驱赶哪些 Pod与 Qos 机制有关(1.8),1.9 以后的版本请看下文分解 只有当节点内存和磁盘资源 ...
最新文章
- gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表
- explode php 报错,PHP函数explode和split的区别
- [C# 开发技巧系列]如何动态设置屏幕分辨率
- CentOS 配置epel源
- Java初学者福音——自动设置环境变量
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 | 证明 原序列实部 x_R(n) 的 傅里叶变换 是 原序列傅里叶变换 的 共轭对称序列 )
- 3-unit1 IPv6网络的管理
- UITextView实现图文混排效果
- zabbix在configure时候遇到的问题(Ubuntu\debian)
- linux查找influx的安装位置,InfluxDB学习之InfluxDB的安装和简介 | Linux大学
- 近似装箱问题(两种脱机算法实现)
- linux here用法,linux shell的here document用法(cat EOF)
- 渗透测试之Nmap命令(三) idle 扫描
- 数据库笔记02:查询与统计数据
- 如何跨越线程调用窗体控件?(1)
- Workflow之Activity
- C# 中的DevExpress CheckedListBoxControl控件
- 两WinForm和两WebForm传值
- vosviewer保存成PDF文件时没有文字
- php eclipse 版本_PHPEclipse官方下载
热门文章
- hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...
- js php 获取时间倒计时_,js实现倒计时及时间对象
- 自拟计算机作文100字,玩电脑作文100字胡佳慧
- 编写Java 制作留言板_JSP+Servlet+JavaBean制作简单留言板
- 汽车和山羊问题matlab_关于博弈的山羊与汽车问题
- html web form id,小程序如何获取多个formId实现详解
- 10、计算机图形学——几何介绍(曲面的分类以及示例)
- 大脚导入配置选择哪个文件_IntelliJ IDEA 最常用配置(收藏篇)
- 软件架构自学笔记----分享“去哪儿 Hadoop 集群 Federation 数据拷贝优化”
- 设置centos6.5虚拟机时间同步