HandlerThread
十一月 08, 2017
HandlerThread
1.Handler是什么?
1.1 handlerThread产生背景
开启Thread子线程进行耗时操作
多次创建和销毁线程是很消耗系统资源的
(通过阻塞等待)
handler + thread + looper
一个内部有looper的thread
(普通handler如果创建在子线程, 由于handler消息处理需要一个messagequeen的looper, 但默认创建子线程时候没有looper就会发生异常报错;
如果想在子线程中创建一个handler就必须手动初始化looper,调用looper.loop()方法开启循环)
1.2 handlerThread 的特点
- HandlerThread 本质上是一个线程类, 它继承了Thread;
- HandlerThread 有自己的内部Looper对象, 可以进行looper循环;
- 通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage()方法中执行异步任务;
- 有点是不会有阻塞, 减少了对性能的消耗;
- 缺点是不能同时进行多任务的处理, 需要等待进行处理, 处理效率较低;
- 与线程池注重并发不同, HandlerThread是一个串行队列, HandlerThread背后只有一个线程;
2. HandlerThread源码解析
2.1 构造方法
构造方法里可设置名称和优先级;
1 | public HandlerThread(String name) { |
2.2 onLooperPrepared()空方法
可以在需要的时候去复写它, 它执行在loop之前;
1 | /** |
2. 3 run()方法;
synchronized: 当有两个并发线程访问同一个对象, 一个时间内只能有一个线程得到执行;
而另一个线程也要执行, 就必须等待另一个线程也执行完;(这里通知的是getLooper()中的wait())
1 |
|
2.4 getLooper():
在获取mylooper时候存在一个同步问题, 只有当上面线程创建成功, looper对象也创建成功时, 才会通知下面的;wait();
1 | /** |
2.5 quit():
退出消息循环, 退出线程
1 | /** |
2.6 quitSafely():
退出消息循环, 退出线程(效率上不是很高, 但更安全)
1 | /** |
查看评论