[Android进阶】Handler机制原理解析_android handler的机制和原理

83 阅读8分钟
}
     sThreadLocal.set(new Looper(quitAllowed));
 } 

从上面的程序可以看出通过prepareMainLooper(),然后调用 prepare(boolean quitAllowed)方法创建了一个Looper对象,并通过sThreadLocal.set(new Looper(quitAllowed))方法将该对象设置给了sThreadLocal。



//通过ThreadLocal获取Looper public static @Nullable Looper myLooper() { return sThreadLocal.get(); }


通过Looper中的预备工作,sThreadLocal中已经存储了一个Looper对象,然后myLooper()方法通过sThreadLocal.get()方法获取到了Looper。那么消息队列就与线程关联上了,所以各个线程只能访问自己的消息队列。


综上所述,我们可以发现消息队列通过Looper与线程关联上了,而Looper又与Handler是关联的,所以Handler就跟线程、线程的消息队列关联上了。


3.2 如何执行消息循环?  
 在创建Looper对象后,通过Handler发来的消息放在消息队列中后是如何被处理的呢?这就涉及到了消息循环,消息循环是通过Looper.loop()方法来建立的。源代码如下:



//执行消息循环 public static void loop() { final Looper me = myLooper(); if (me == null) { throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread."); } final MessageQueue queue = me.mQueue;//获取消息队列 //代码省略 for (;;) {//死循环 Message msg = queue.next(); // 获取消息 if (msg == null) { // No message indicates that the message queue is quitting. return; } //代码省略 try { msg.target.dispatchMessage(msg);//分发消息 } finally { if (traceTag != 0) { Trace.traceEnd(traceTag); } } //代码省略 msg.recycleUnchecked();//消息回收 } }


从源码中我们可以看出,loop()方法实质上就是通过一个死循环不断的从消息队列中获取消息,然后又不断的处理消息的过程。


3.3 消息处理机制



> 
> msg.target.dispatchMessage(msg);//分发消息
> 
> 
> 


我们从loop中的 dispatchMessage()方法入手,看看谁是该方法的调用者,深入Message源码中看看target的具体类型:



public final class Message implements Parcelable { //代码省略

    /*package*/ int flags;
    /*package*/ long when;
    /*package*/ Bundle data;
    /*package*/ Handler target;
    /*package*/ Runnable callback;
    /*package*/ Message next;

    //代码省略
} 

从源码中我们可以看到其实target就是Handler类型。所以Handler是将消息发送到消息队列暂时存储下,然后又将消息发送给Handler自身去处理。那我们继续到Handler源码中去看看Handler是如何处理消息的:



public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }



private static void handleCallback(Message message) { message.callback.run(); }



/**

  • Subclasses must implement this to receive messages.
  • 消息处理方法为一个空方法,由子类去实现 */ public void handleMessage(Message msg) { }

从上面的源码中可以看出,dispatchMessage(Message msg)只负责分发Message。从Message源码中我么可以知道callback为Runnable类型,如果callback不为空,则执行 handleCallback方法来处理,而该方法又会调用callback.run();如果如果callback为空,则调用handleMessage来处理消息,而该方法又为空,所以我们会在子类中重写该方法,并将修改UI的代码写在里面。之所以会出现这两种情况,是因为Handler发送消息有两种形式:


在本文的一般使用步骤中,我使用的是sendMessage(msg)发送消息,此时callback就为空。  
 当使用post发送消息时,callback就不为空。  
 以上就是Handler机制的原理,大致可以总结为:在子线程中Handler将消息发送到MessageQueue中,然后Looper不断的从MessageQueue中读取消息,并调用Handler的dispatchMessage发送消息,最后再Handler来处理消息。为了更好的帮助大家一起理解,我画了一个Handler机制的原理图:


![73a9f2d42040a363d62cf1b572cfcc6a_看图王.png](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b4a4776a7580415ea91bd32a20386544~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=Q%2FxXGxryfmOHeEraJ1EVZ%2FpsqBI%3D)


关于Handler机制补充如下几点:


Handler创建消息时用到了消息池,在创建消息时会先从消息池中去查询是否有消息对象,如果有,则直接使用消息池中的对象,如果没有,则创建一个新的消息对象。  
 使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。


最后:后续会持续更新哦,喜欢的话就点赞关注一下吧。


相关视频  
 [【Android源码解析】Handler源码解析及大厂面试重点问题]( )


析】Handler源码解析及大厂面试重点问题](https://link.juejin.cn/?target=https%3A%2F%2Fwww.bilibili.com%2Fvideo%2FBV1t34y1X7En%3Fspm\_id\_from%3D333.999.0.0 “https://www.bilibili.com/video/BV1t34y1X7En?spm\_id\_from=333.999.0.0”)


## 最后


按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。


整个笔记一共**8大模块、729个知识点,3382页,66万字**,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2f1382554cb943b3807f11378a79d168~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=EDUoL7F6hdsgLyDmSxJoAmEU7kE%3D)


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/59e0a265b0e74a50bd6f69a9bd5ce6d5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=G%2FMub7Ost5NNeAOnbJJKWEQK2kc%3D)


因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。


如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。


相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。


#### (一)架构师必备Java基础


1、深入理解Java泛型


2、注解深入浅出


3、并发编程


4、数据传输与序列化


5、Java虚拟机原理


6、高效IO


……


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e698e544ccee459d8c4b3e825aa37e70~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=cv61ibs%2FVyVV90NPLJnUFCdVtKI%3D)


#### (二)设计思想解读开源框架


1、热修复设计


2、插件化框架设计


3、组件化框架设计


4、图片加载框架


5、网络访问框架设计


6、RXJava响应式编程框架设计


……


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2674753dfbda4cfdadbbb27eda3bc232~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=o7KAmLzXnMG4xRzugTGETB4Mig0%3D)


#### (三)360°全方位性能优化


1、设计思想与代码质量优化


2、程序性能优化


* 启动速度与执行效率优化
* 布局检测与优化
* 内存优化
* 耗电优化
* 网络传输与数据储存优化
* APK大小优化


3、开发效率优化


* 分布式版本控制系统Git
* 自动化构建系统Gradle


……


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/195d24cd260a4826baab3b03afba13c9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=W2wQgOfNgCJ72uMGtmqLK8F28Oc%3D)


#### (四)Android框架体系架构


1、高级UI晋升


2、Android内核组件


3、大型项目必备IPC


4、数据持久与序列化


5、Framework内核解析


……


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b036378ef07c49beb042e05280df5299~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=vPw9WQ%2FMqLhsPbWgwqecd9dSKrA%3D)


#### (五)NDK模块开发


1、NDK开发之C/C++入门


2、JNI模块开发


3、Linux编程


4、底层图片处理


5、音视频开发


6、机器学习


……


![图片](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/8419ad49341242e58813d9288ec4c8fa~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=%2Bv6qL5PXtK4HAgAYxmCAGOxO4zU%3D)


#### (六)Flutter学习进阶





还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5de35860343f43efbb3e9b27b63b6fb2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=ZkWB3e%2F1ZVEHogFWb8MjN08lF7c%3D)








![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7bd89c34f2cf48dfa2579b331331aba9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=f9n89lK8o8PvRq7J1pNVhxIdMe4%3D)





![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/eb74d80e31044affb11164260f18ecab~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=kHtoCqGHWYDauLwaGbCjA5fNoFc%3D)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/482f6c70413044b8a051e3f5030d2bbb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=MbTJoxEIrowMJyqknUfPdVAEUQs%3D)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a3a8e0025b214d5baed368d35d644b3b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDgwNDUxMTkwMTI=:q75.awebp?rk3s=f64ab15b&x-expires=1772721033&x-signature=4rQHhhVyulb%2Fo3UUcZtfRtq6ARI%3D)
详情docs.qq.com/doc/DSlhRRFFyU2pVZGhS