美文网首页Android面试相关Android面试系列Android开发
Android面试(七):异步消息机制之HandlerThrea

Android面试(七):异步消息机制之HandlerThrea

作者: zhang_pan | 来源:发表于2018-02-11 12:08 被阅读71次

    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面试(七):异步消息机制之HandlerThrea

        本文链接:https://www.haomeiwen.com/subject/esynzxtx.html