HandlerThread的解析
一、HandlerThread的使用
//创建实例对象
HandlerThread handlerThread=new HandlerThread("thread_handler");
//开启循环
handlerThread.start();
//创建handler,looper使用的是handlerThread的looper
Handler handler=new Handler(handlerThread.getLooper()){@Overridepublic void handleMessage(Message msg) {//工作线程中处理问题super.handleMessage(msg);}};//发送消息
handler.sendEmptyMessage(0);//结束线程,停止消息循环
handlerThread.quit();
二、HandlerThread的源码分析
1、HandlerThread是Thread的子类,线程类
public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;private @Nullable Handler mHandler;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}
2、当我们调用start方法后,HandlerThread会执行run方法,run方法创建当前线程的Looper,并把创建的looper赋值给成员变量mLooper.
@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}
3、初始化Handler的时候,把工作线程的looper作为参数传入,所以handler就能操作工作线程looper和messageQueue,创建完handler实例,就可以发送消息了。
Handler handler=new Handler(handlerThread.getLooper()){@Overridepublic void handleMessage(Message msg) {//工作线程中处理问题super.handleMessage(msg);}};
这里HandlerThread的getLooper方法,当判断当前线程的Looper还没创建后(就是还没有调用线程的start()),他会阻塞当前线程。
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;}
4、当不想使用工作线程了,需要停止消息循环,这一步必须,否则工作线程的looper一直运行。
handlerThread.quit();
handlerThread.quitSafely();
三、Handler,Thread,HandlerThread的区别
- Handler在Andorid中负责发送和处理消息,通过它可以实现工作线程和主线程的消息通讯。
- Thread 线程,是CPU调度和分配的基本单位
- HandlerThread 一个继承自Thread类的HandlerThread,run方法中创建了工作线程的Looper,可以用于工作线程的消息循环
HandlerThread的解析相关推荐
- 面试必问的一个知识点,关于HandlerThread的使用场景以及怎样使用 HandlerThread?
前言 有些同学老问我,快要校招了 今年的金三银四退成了金四银五了,我改准备哪些知识点去面试复习,然而要准备的知识点很庞大,今天要讲的知识其中之一.一篇关于HandlerThread的解析 文档笔记~ ...
- 秋招 百度二轮面试---血淋淋的经历写实
一名自信向上的良好青年,参加百度面试被面试官按在地板来回摩擦~ 简单回顾一下,面试的经历吧 百度二面对话大概是这样的. 面:这个知道吗? 我:不知道. 面:这个呢? 我:不知道. 面:那我问你这个吧. ...
- Android线程,线程池使用及原理博文参考
2019独角兽企业重金招聘Python工程师标准>>> 还是先回顾下Handler消息机制的原理图: 同样的还是先看看一篇对<Android开发艺术探索>的总结,对线程和 ...
- 2018 秋招 百度二轮面试---血淋淋的经历写实
2017 秋招 百度二轮面试-血淋淋的经历写实 一名自信向上的良好青年,参加百度面试被面试官按在地板来回摩擦~(不知是哪位好汉说的,借用一下) 简单回顾一下,下午的经历吧 下午百度二面对话大概是这样的 ...
- 百度java面试应届,秋招 百度二轮面试---血淋淋的经历写实
一名自信向上的良好青年,参加百度面试被面试官按在地板来回摩擦~ 简单回顾一下,面试的经历吧 百度二面对话大概是这样的. 面:这个知道吗? 我:不知道. 面:这个呢? 我:不知道. 面:那我问你这个吧. ...
- 2017常见android面试题
介绍自己负责的部分,如何实现的. 框架的搭建 排查问题以及结解决方式 兼容性保证 性能优化 上线之后模块导致crash的比例 自定义view viewGroup 这个就是约定的几个方法,onMeasu ...
- 搜集整理的一些博客导航
简介:第一次在CSDN上发表博客,将自己关注或者看过的一些博客整理了一下,其中包含了鸿神和郭神的全部博客,包括两位大神微信公众号推荐的博客,另外还有一些安卓开发社区的博客,后续每天都会更新这个导航,希 ...
- Android(2017-2018)BAT面试题整理(Android篇,含答案)
1.四大组件 - Activity Activity详细总结 - 简书 - Service Carson带你学Android:一份全面 & 简洁的 Service 知识讲解攻略 - 简 ...
- Android伸手党系列之六:Android开发进阶
这是android伸手党知识收集系列的第六篇,来整理android开发进阶相关知识:Window,View,事件分发,NFC,蓝牙等. Android View 简介 View的简介 那些你应该知道却 ...
最新文章
- OpenCV error: Cannot load info library for OpenCV
- 查询Linux系统网卡流量负载,超好用linux系统查询网卡等流量参数的工具,分享给大家!!!...
- 及时沟通的重要性_沟通与代码同样重要
- python 共享数据_用Python共享全局数据
- 机房线路故障,引发多家公司不能上网,和自己de经历有感
- 华为P30 Pro终极渲染图曝光:后置徕卡四摄颜值出众
- editor.md实现拖拽剪切复制粘贴上传图片,文件插件
- 转载 hashtable和dictionary的区别
- 2019一注结构成绩_2019年福建地区计算机考研汇总分析
- Java SE 和 Java EE 的区别
- Jquery(十)jqueryUI常用功能实战
- 排队论----学习反馈
- ES6重要知识点总结
- Inception(盗梦空间)及代码实现
- Proximal Policy Optimization近端策略优化(PPO)
- 香港城大:首创3D打印磁控微型机器人技术,推动人体送药研究发展
- 天梯赛题目练习——平面向量加法(附带PTA测试点)
- 们指点如果在android平台下开启jbox2d的debugDraw功能
- python正则表达式详解compile_python正则表达式详解
- Matlab车牌识别
热门文章
- java通过thrift连接hbase查询数据
- css 多层ul li,css中的ul li ul li ul li ul li 实现四级菜单
- 易基因:NAR:ChIP-seq等揭示蛋白质酰基化与c-di-GMP协同调控放线菌发育与抗生素合成机制|项目文章
- 常用的git分支管理方法都在这了
- php_extension moodle,[转载]PHP Moodle二次开发
- Pet Store安装ok
- 收到一封CTO来信,邀约面试机器学习工程师
- html + css + javascript 写的程序员表白代码
- 1.5计算机性能评测
- 基于kurento-one2many二次开发实现多房间直播+共享桌面+切换摄像头+聊天互动