文化袁探索专栏——Activity、Window和View三者间关系 文化袁探索专栏——View三大流程#Measure 文化袁探索专栏——View三大流程#Layout 文化袁探索专栏——消息分发机制 文化袁探索专栏——事件分发机制 文化袁探索专栏——Launcher进程启动流程’VS’APP进程启动流程 文化袁探索专栏——Activity启动流程 文化袁探索专栏——自定义View实现细节 文化袁探索专栏——线程安全 文化袁探索专栏——React Native启动流程
消息分发机制,必定离不开Handler、Looper、MessageQueue三者间关系;
关系: 一个线程之多有一个Looper;一个looper有一个MessageQueue;而一个MessageQueue对应了多个message;一个MessageQueue对应多个Handler。
先引出一个问题——为什么非静态类的 Handler 导致内存泄漏?如何解决?
非静态内部类、匿名内部类、局部内部类等,都会隐士的持有其外部类的引用。即若在Activity中创建了非静态Handler,那么会由此持有Activity的引用。当非静态Handler使用在主线程时,会默认绑定该线程的Looper对象,并关联它的MessageQueue,Handler发出的消息都会enQueue到MessageQueue消息队列中。(Looper对象的生命周期贯穿主线程整个生命周期)。当消息队列MessageQueue中还有未处理完的message消息时,因为每个message都持有Handler引用,handler无法被回收。同时handler持有的外部类Activity引用也无法回收,从而造成了泄露。
解决方案:使用静态内部类 + 弱引用方式
消息分发原理
发送消息 消息插入队列(enQueue) 消息出队
|