HandlerThread 是 真正干活的,本身就是一个Thread:

HandlerThread extends Thread

主要比普通的Thread多了一个Looper,而hanlderThread的run函数其实很简单:

    @Override    public void run() {        mTid = Process.myTid();        Looper.prepare();               这一步就生了该Thread自己的Looper        synchronized (this) {            mLooper = Looper.myLooper(); mLooper其实一个ThreadLocal变量,每个Thread有自己的一个Looper            notifyAll();        }        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        在得到Looper以后,就开始无限loop了,直到被要求结束,才会结束run函数,而HandlerThread的生命也结束。        mTid = -1;    }

Looper中有一个static final 的 ThreadLocal:

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); 这就意味着每个Thread 都有一个自己的sThreadLocal

而sThreadLocal中的Looper是在prepare()时生成的:

    private static void prepare(boolean quitAllowed) {        if (sThreadLocal.get() != null) {            throw new RuntimeException("Only one Looper may be created per thread");        }        sThreadLocal.set(new Looper(quitAllowed));    }
Looper中有

final MessageQueue mQueue; 就是存放要执行的任务, 在构造时生成: mQueue = new MessageQueue(quitAllowed);
final Thread mThread; 记录运行自己的Thread, 在构造的时候就绑定了: mThread = Thread.currentThread();

Looper的quit其实就是mQueue的quit:

    public void quit() {        mQueue.quit(false);    }

可以看到,真正干活的所有成员就是handlerThread,

而Handler的作用在这里类似于一个对Looper的代理和封装:

首先,handler的构造需要一个Looper, 如果不制定Looper,那么就用当前线程的Looper,因此,在一个Thread使用Handler的前提是该线程的Looper要存在。

public Handler(Callback callback, boolean async) {........................................................        mLooper = Looper.myLooper();        if (mLooper == null) { 如果当前Thread还没有自己的Looper,那么就 RuntimeException。            throw new RuntimeException(                "Can't create handler inside thread that has not called Looper.prepare()");        }        mQueue = mLooper.mQueue;        mCallback = callback;        mAsynchronous = async;    }

而handler基本做的所有关键工作,就是对Looper操作的再封装罢了:

比如,post:

post(Runnable r) -> sendMessageDelayed(getPostMessage(r), 0); -> sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)

-> enqueueMessage(queue, msg, uptimeMillis) -> queue.enqueueMessage(msg, uptimeMillis)

这里的queue,就是Looper的MessageQueue。


Looper提供了 loop()<处理任务的方法> 和 MessageQueue<存放待运行任务的队列> , handlerThread 则负责实际的执行<苦力>

而handler则是对上面这个机制的简便性包装.

handler的封装性也体现在对于其enqueueMessage(...)中,这一步会把要enqueue的Message的target设置为handler自己,这样在后面的Looper的loop()中处理Message时,会直接调用msg.target.dispatchMessage(msg), 这样就实现了handler enqueue的Message最后由handler自己来处理.

更多相关文章

  1. C语言函数的递归(上)
  2. Android(安卓)修改默认按键不震动
  3. Android系统的开机画面显示过程分析(7)
  4. Android(安卓)-HandleThread-给线程传参数
  5. Android(安卓)APK+Dex文件反编译及回编译工具
  6. Android(安卓)更新ProgressBar
  7. WindowManager和Window添加View的区别
  8. 浅谈Android网络请求的前世今生-元基础HttpConnection
  9. android线程间通信和主线程更新ui

随机推荐

  1. [转]Android(安卓)源代码结构
  2. Android7.0中文文档(API)-- AlphabetIndexe
  3. Android(安卓)源代码结构
  4. Android(安卓)Init Language(android init
  5. 制作android/cordova splash screen
  6. Android(安卓)EditText 限制文本框输入的
  7. Android图片的处理类
  8. Android7.0中文文档(API)-- Filter
  9. gradle DSL method not found: android()
  10. Android摄像头相关问题记录