Android面试(七):异步消息机制之HandlerThread面试你所需知道的一切

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的特点:

  1. HandlerThread本质上是一个线程类,它继承了Thread;
  2. HandlerThread有自己的内部的Looper对象,可以进行looper循环;
  3. 通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage法中执行异步任务;
  4. 优点是不会有阻塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低。
  5. 与线程池注重并发不同,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;
    }

喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!

你可能感兴趣的:(Android面试(七):异步消息机制之HandlerThread面试你所需知道的一切)