Android为了方便对Thread和Handler进行封装,也就是HandlerThread。HandlerThread继承自Thread,说白了就是Thread加上一个Looper。源码:

可以看到其本身便持有一个Looper对象。

之前学习的时候有两个疑问:

1. HandlerThread为什么start完了之后不会退出?

一般我们都是在某个方法里(如onCreate)调用start方法来启动HandlerThread:

mWorkThread = new HandlerThread("workThread");
mWorkThread.start();

那岂不是在调用完start方法之后就退出了?那这有什么意义,如果是一个普通的线程:

Thread thread = new Thread();
thread.start();

在调用完start()方法之后肯定会退出的。

查看HandlerThread源码:

    @Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}

当调用完start()方法后系统会自动调用run()方法,run方法里有一个 Looper.loop();

可以看到这个looper方法里有一个死循环,它也是跑在run方法里的,所以HandlerThread在start()完了之后不会立即退出。

2. Handler里的handlerMessage()方法究竟运行于哪个线程?

handlerMessage()方法究竟运行于哪个线程,得看这个方法在哪个线程里被调用,之前分析过handlerMessage是在Looper的loop()方法里辗转被调用的。

Looper#loop()

Handler#dispatchMessage()

那其实可以这样说,Looper.loop()方法跑在哪个线程,handlerMessage就跑在哪个线程。

对于自定义的Thread+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();
}
}

很明显,handlerMessage()方法跑在子线程。

对于HandlerThread方式:

HandlerThread#run()

    @Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}

也是跑在子线程。

对于mHandler = new Handler()方式:

虽然未传Looper, 但默认使用的是主线程的Looper, 所以此时handlerMessage跑在主线程。

HandlerThread: HandlerThread的理解的更多相关文章

  1. 关于HandlerThread的分析

    Android中的Thread没有对java中的Thread做任何封装,而Android提供了一个遍历方法HandlerThread,他继承于Thread,实现了对遍历系统的一些封装,下面研究一下Ha ...

  2. HandlerThread源码分析

    其实原本HandlerThread的分析不应该单独开一篇博客的,应该在讲消息机制的那一片中一起分析. 但当时忘记了,而且今天第一次用MarkDown写博客,有点上瘾,就再来一篇,权当滥竽充数过过手瘾. ...

  3. HandlerThread学习

    之前基本讲过Handler的一些知识了,我们今天学习下Google封装的一个实现线程通信的一个类HandlerThread 一.HandlerThread使用 @Override protected ...

  4. Android 开发 HandlerThread详解 转载

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/75073307 对于Handler不太懂的可以参考我的这两篇文章: Androi ...

  5. Handler,Looper,HandlerThread浅析

    Handler想必在大家写Android代码过程中已经运用得炉火纯青,特别是在做阻塞操作线程到UI线程的更新上.Handler用得恰当,能防止很多多线程异常. 而Looper大家也肯定有接触过,只不过 ...

  6. Android HandlerThread 总结使用

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6062880.html 本文出自[赵彦军的博客] 前言 以前我在 [Android Handler.Loop ...

  7. Android HandlerThread 的使用及其Demo (转)

    转自http://www.cnblogs.com/hnrainll/p/3597246.html 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多 ...

  8. HandlerThread

    一.概念     1.Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误. 2.HandlerTh ...

  9. HandlerThread 用法

    HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理. HandlerThread背后只有一个线程,所以任务是串行依次执行的.串行相对于并行来说更安全,各任 ...

随机推荐

  1. 从SVN资源库下载项目

    1.这个操作和新建Import导入项目差不多,先左上角File--Import--SVN(这个在弹出窗口的下面)平时都是选最上面的General,再点从SVN检出项目. 2.创建新的资源库位置,然后输 ...

  2. ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制

    ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...

  3. 微信小程序之随笔

    先写到这里https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/AuthSetting.html

  4. 《The One!团队》第八次作业:ALPHA冲刺(四)

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件测试基础技术.(2)学习迭代式增量软件开发过程(Scrum) 第四天 ...

  5. 大马过安全狗拿webshell方法

    很多拿站的朋友,都知道大马很多都会被安全狗拦截,最近一个大牛给我一个方法,竟然成功,所以分享下这个方法. 将大马写到一个txt文件里面,命名为dama.txt,再建一个文本文档,asp的就写入:< ...

  6. 十四.Protobuf3扩展

    在您发布使用Protocol Buffer区的代码后,您迟早会因为业务需求变更想要“改进”Protocol Buffer的定义.如果你想让你的新Protocol Buffer向后兼容,让你的旧Prot ...

  7. sizeof的注意点

    sizeof('a')的值为4.因为此处‘a’是独立存在的一个字符(没有赋值给其它变量),实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制为整数97.(貌似解释得有些牵强,但事 ...

  8. 【贪心】Stripies POJ 1862

    题目描述:http://poj.org/problem?id=1862 题目大意:你有n个数要合并,每两个数x,y合并后得到2*sqrt(x*y).求最后留下的一个数的最小值. 每合并一次,就会有数被 ...

  9. (转载) 搭建非域AlwaysOn win2016+SQL2016

    非域搭建Alwayson只是省去搭建域控那一部分,其他大同小异 条件: 操作系统:windows server 2016 数据库:SQL Server 2016 SSMS版本:17.3 节点1:HDD ...

  10. CS229开源项目

    斯坦福大学CS 229机器学习备忘单: https://github.com/kaobeixingfu/stanford-cs-229-machine-learning CS229机器学习算法的Pyt ...