1. HandlerThread 是什么?
HandlerThread 本质上是一个线程类, 它继承了 Thread;
HandlerThread 有自己的内部的 Looper 对象, 可以进行 looper 循环;
通过获取 HandlerThread 的 looper 对象传递给 Handler 对象, 可以在 handleMessage 方法中执行异步任务;
2. HandlerThread 产生背景:
当面试官在问我们 Handler 在子线程中怎么发送消息, 这时候有人就会说了, 我们可以拿到主线程的 Looper 或者通过手动调用 Looper.prepare 和 Looper.loop, 这显然是可以的, 这时候面试官可能来了一句: 还有其他方式嘛? 瞬间懵逼, 有没有!!(如果没接触过 HandlerThread) 其实, 这种在子线程中发送消息的情况, google 工程师早就给我们提供了, 这就是 HandlerThread 的产生背景, 它不需要我们去拿主线程的 Looper, 也不用手动调用 Looper.prepare 和 Looper.loop, 它已经封装了 Looper, 并手动调用了这两个方法
3. HandlerThread 的特点:
HandlerThread 本质上是一个线程类, 它继承了 Thread;
HandlerThread 有自己的内部的 Looper 对象, 可以进行 looper 循环;
通过获取 HandlerThread 的 looper 对象传递给 Handler 对象, 可以在 handleMessage 法中执行异步任务;
优点是不会有阻塞, 减少了对性能的消耗, 缺点是不能同时进行多任务的处理, 需要等待进行处理, 处理效率较低
与线程池注重并发不同, HandlerThread 是一个串行队列, HandlerThread 背后只有一个线程
4. HandlerThread 的机制原理:
HandlerThread 是继承 Thread 类的, 本质上是一个线程类, 代码比较简单, 主要看两个方法 run() 和 getLooper()
- public void run() {
- mTid = Process.myTid();
- Looper.prepare();
- synchronized(this) {
- mLooper = Looper.myLooper();
- notifyAll();
- }
- Process.setThreadPriority(mPriority);
- onLooperPrepared();
- Looper.loop();
- mTid = -1;
- }
在 run 方法中调用了 Looper.prepare, 创建了 Looper 对象, 并将 Looper 对象绑定到当前线程中, 同步机制获取 Looper 对象
- 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;
- }
来源: http://www.jianshu.com/p/a238dce71185