android HandlerThread 循环线程

工作线程串行执行

  • Looper
    能够确保线程持续存活并且可以不断的从任务队列中获取任务并进行执行
  • Handler
    能够帮助实现队列任务的管理,不仅仅能够把任务插入到队列的头部,尾部,还可以按照一定的时间延迟来确保任务从队列中能够来得及被取消掉
  • MessageQueue
    使用 Intent,Message,Runnable 作为任务的载体在不同的线程之间进行传递。
  • 使用

    //1.创建实例对象
    HandlerThread handlerThread = new HandlerThread("handlerThread");
    //2.启动HandlerThread线程,构建完一个循环线程
    handlerThread.start();
    //3.构建循环消息处理机制 Handler
    Handler subHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            //实现自己的消息处理
            return true;
        }
    });
    

    HandlerThread

    public class HandlerThread extends Thread {
        //线程优先级
        int mPriority;
        //当前线程id
        int mTid = -1;
        //当前线程持有的Looper对象
        Looper mLooper;
    
        //构造方法
        public HandlerThread(String name) {
            //调用父类默认的方法创建线程
            super(name);
            mPriority = Process.THREAD_PRIORITY_DEFAULT;
        }
       //带优先级参数的构造方法
        public HandlerThread(String name, int priority) {
            super(name);
            mPriority = priority;
        }
    
        protected void onLooperPrepared() {
        
        }
    
        @Override
        public void run() {
            //获得当前线程的id
            mTid = Process.myTid();
            //准备循环条件
            Looper.prepare();
            //持有锁机制来获得当前线程的Looper对象
            synchronized (this) {
                mLooper = Looper.myLooper();
                //发出通知,当前线程已经创建mLooper对象成功,这里主要是通知getLooper方法中的wait
                notifyAll();
            }
            //设置当前线程的优先级
            Process.setThreadPriority(mPriority);
            //该方法实现体是空的,子类可以实现该方法,作用就是在线程循环之前做一些准备工作,当然子类也可以不实现。
            onLooperPrepared();
            //启动loop
            Looper.loop();
            mTid = -1;
        }
        
        public Looper getLooper() {
            //如果线程不是存活的,则直接返回null
            if (!isAlive()) {
                return null;
            }
    
            // If the thread has been started, wait until the looper has been created.
            //如果线程已经启动,但是Looper还未创建的话,就等待,知道Looper创建成功
            synchronized (this) {
                while (isAlive() && mLooper == null) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
            return mLooper;
        }
        
        public boolean quit() {
            Looper looper = getLooper();
            if (looper != null) {
                looper.quit();
                return true;
            }
            return false;
        }
        
        //安全退出循环
        public boolean quitSafely() {
            Looper looper = getLooper();
            if (looper != null) {
                looper.quitSafely();
                return true;
            }
            return false;
        }
    }

    Looper

    Handler

    其他线程(发送) --->> 绑定线程(执行)

    Handler机制扩展

    其他线程(发送) --->> UI线程(执行)

    Message

    api

    MessageQueue