先把结论放在前面:Handler 的消息机制由四段构成——Looper循环取消息、MessageQueue按时间排序、Message对象池复用、dispatchMessage找到目标 Handler 回调。其中决定"能不能跑起来"的前提只有一个:Handler与Looper必须绑定,而Looper与Thread通过ThreadLocal一对一绑定。讲不清ThreadLocal这一层,整套机制就只是一串 API。
这道题之所以考判断力,是因为它没有高深 API,全是工程细节。同一个知识点,会用的人和只会背的人,差别体现在三处:知不知道Message有对象池、说不清post与sendMessage的差别在哪、遇到"子线程用 Handler"时是知道该prepare还是改用HandlerThread,还是现场编译报错。
从 ThreadLocal 讲起:一切的前提
理解这套机制的起点,是Looper的存储方式。每个线程最多只有一个Looper