Handler 中的奥秘

简介: Handler 中的奥秘

Handler 允许我们发送延时消息,如果在延时期间用户关闭了 Activity,那么该 Activity 会泄露。这个泄露是因为 Message 会持有 Handler,而又因为 Java 的特性,内部类会持有外部类,使得 Activity 会被 Handler 持有,这样最终就 导致 Activity 泄露。

解决:将 Handler 定义成静态的内部类,在内部持有 Activity 的弱引用,并在 Acitivity 的 onDestroy()中handler.removeCallbacksAndMessages(null)及时 移除所有消息。

为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ?

通常我们认为 ActivityThread 就是主线程。事实上它并不是一个线程,而是主 线程操作的管理者。在 ActivityThread.main() 方法中调用了 Looper.prepareMainLooper() 方法创建了 主线程的 Looper ,并且调用了 loop() 方法,所以我们就可以直接使用 Handler 了。因此我们可以利用 Callback 这个拦截机制来拦截 Handler 的消息。如大部分 插件化框架中 Hook ActivityThread.mH 的处理

主线程不允许退出,退出就意味 APP 要挂。


Handler 里藏着的 Callback 能干什么?Handler.Callback 有优先处理消息的权利 ,当一条消息被 Callback 处理并拦截 (返回 true),那么 Handler 的 handleMessage(msg) 方法就不会被调用了;如果 Callback 处理了消息,但是并没有拦截,那么就意味着一个消息可以同时 被 Callback 以及 Handler 处理。

创建 Message 实例的最佳方式 为了节省开销,Android 给 Message 设计了回收机制,所以我们在使用的时候 尽量复用 Message ,减少内存消耗: 通过 Message 的静态方法 Message.obtain(); 通过 Handler 的公有方法 handler.obtainMessage()。

子线程里弹 Toast 的正确姿势 本质上是因为 Toast 的实现依赖于 Handler,按子线程使用 Handler 的要求修 改即可,同理的还有 Dialog。妙用 Looper 机制  将 Runnable post 到主线程执行; 利用 Looper 判断当前线程是否是主线程。

相关文章
|
JSON 开发工具 git
git rebase 合并当前分支的多个commit记录
git rebase 合并当前分支的多个commit记录
441 1
|
SQL 自然语言处理 关系型数据库
PolarDB自然语言到SQL语言转义
PolarDB自然语言到SQL语言转义
|
消息中间件 存储 Java
RabbitMQ——高级篇
RabbitMQ——高级篇
168 0
|
存储 Java 编译器
ThreadLocal、InheritThreadLocal、TransmittableThreadLocal
ThreadLocal、InheritThreadLocal、TransmittableThreadLocal
323 0
|
存储 运维 架构师
我为什么觉得数字中台是团队的新型基础设施
技术中台是数字中台和数据中台的基础设施,因为技术中台提供了通用的技术组件和服务,使得数字中台和数据中台能够更加快速、高效地进行开发和部署。比如,技术中台提供的标准化接口和服务可以帮助数字中台和数据中台实现应用程序和数据的集成和共享,从而提高企业的运营效率和质量。
|
存储 运维 DataWorks
函数计算产品使用问题之如何开通GPU权限
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
存储 数据库 Python
Pandas 2.2 中文官方教程和指南(二十一·二)(2)
Pandas 2.2 中文官方教程和指南(二十一·二)
73 0
|
Python 容器 机器学习/深度学习
Python语言基础学习大纲(由某大模型生成)
Python语言基础学习大纲(由某大模型生成)
145 0
Python语言基础学习大纲(由某大模型生成)
|
前端开发
前端学习笔记202305学习笔记第二十四天-vue3.0-element icon引入
前端学习笔记202305学习笔记第二十四天-vue3.0-element icon引入
93 0
|
消息中间件 SQL 算法
把脉分布式事务的模型、协议和方案
在当前的技术发展阶段,不同的业务场景对一致性、可靠性、易用性、性能等要求不同,应用架构可以根据实际场景的需求,灵活选择合适的分布式事务解决方案。行业中把分布式事务解决方案分为刚性事务方案和柔性事务方案这两大类。 就刚性事务这个范畴,DTP已经成为事实上的事务模型组件的行为标准,解决了不少分布式事务的问题。但随着技术以及业务场景的演进发展,其缺点和局限性也越来越明显,伴随着 BASE 理论的提出,诸多柔性事务方案(如可靠消息、最大努力通知、AT、TCC、Saga)诞生,满足了各类业务场景的差异化需求。
259 0