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跑在主线程。

最新文章

  1. iOS开发之cell多按钮
  2. C语言--static全局使用示例
  3. cxf 消息寻址
  4. Canvas修行之黑客帝国代码雨
  5. Google Protocol Buffer 的使用和原理
  6. 菜鸟学Linux命令:grep配合ls等使用
  7. S3
  8. Notes of the scrum meeting(10/30)
  9. hadoop1中hdfs原理详解
  10. speex的基本编码和解码流程
  11. 剑指offer面试题14-调整数组顺序使奇数位于偶数前面
  12. 设置Oracle数据库开机自启动-亲试ok
  13. man sm-notify(sm-notify命令中文手册)
  14. MariaDB安装及基本配置
  15. Android -- 仿淘宝广告条滚动
  16. PAT 1017 Queueing at Bank[一般]
  17. CodeForces - 1098.DIV1.C: Construct a tree(贪心,构造)
  18. 201709021工作日记--CAS解读
  19. 红色警戒3原版V1.00基址大全
  20. 基于jquery的json转table插件jsontotable

热门文章

  1. 迷你商城后台管理系统————stage1需求分析
  2. AQS的子类在各个同步工具类中的使用情况
  3. keras模块学习之-目标函数(objectives)笔记
  4. 用python实现多线程爬取影视网站全部视频方法【笔记】
  5. python会缓存小的整数和短小的字符
  6. Django REST framework认证权限和限制和频率
  7. [Svelte 3] Use await block to wait for a promise and handle loading state in Svelte 3
  8. Dubbbo
  9. 浏览器中点击链接,跳转qq添加好友的实现方式
  10. easyui-datagrid统计