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. python判断目录或者文件

    1. 判断目录是否存在 'isdir',删除目录时只有该目录为空才可以 'rmdir' import os if(os.path.isdir('D:/Python_workspace/spyder_s ...

  2. centos7单用户模式

    1 - 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 如果用的是kvm做了c ...

  3. ServicePointManager 类

    地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.servicepointmanager?redirectedfrom=MSDN&am ...

  4. C#屏蔽Alt+F4组合键

    在开发的软件不希望用户关闭的情况下,或者我们不想用户回到桌面,这时候我们就需要屏蔽windows键,或者Alt + F4 键等. //1.将窗体的属性KeyPrieview设置为true //keyp ...

  5. Hibernate的关联关系映射

    技术分析之Hibernate的关联关系映射之一对多映射(重点)        1. JavaWEB中一对多的设计及其建表原则        2. 先导入SQL的建表语句                 ...

  6. LightOJ - 1299 - Fantasy Cricket(DP, 数学)

    链接: https://vjudge.net/problem/LightOJ-1299 题意: 考虑成,U位置的点要往后放,D位置往前放 Dp[i][j]表示处于i位置,还有j个U没有放下. s[i] ...

  7. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

  8. Memcached 与 Redis 区别

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求.   二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库     ( ...

  9. noi.ac #46 最长上升子序列

    \(des\) 长度为 \(n\) 的序列 \(A\),从中删去恰好 \(k\) 个元素(右边的元素往左边移动),记 \(cnt\) 为新 序列中 \(Ai = i\) 的元素个数(即权值与下标相同的 ...

  10. 数据结构实验之查找七:线性之哈希表 (SDUT 3379)

    #include <stdio.h> #include <string.h> #include <stdlib.h> int a[3500]; int Hash[3 ...