![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Handler
文章平均质量分 94
TechMerger
Android平台资深从业者,公众号「Tech Merger」。
展开
-
都 2021 年了,还有人在研究 Handler?建议收藏~
我们经常提及 Android 中极为重要的线程间通信方式即 Handler 机制,貌似 Handler 类发挥了很大的作用。事实上当你了解它的原理之后,会发现 Handler 只是该机制的调用入口和回调而已,最重要的东西是 Looper 和 MessagQueue,以及不断流转的 Message。本次针对该机制常被问及的 18 个问题进行整理和回答,供大家解惑和回顾~1. 简述下 Handler 的总体原理?Looper#prepare() 初始化线程独有的 Looper 以及 Messag..原创 2021-10-05 22:08:25 · 888 阅读 · 0 评论 -
一次性讲清楚 Handler 使用不当导致的内存泄露?
总说 Handler 使用不当会导致内存泄露,真正的原因到底是什么?网上千篇一律的答案貌似没有说到点子上。什么是 Handler 使用不当?先搞清楚什么叫 Handler 使用不当?一般具备这么几个特征:Handler 采用匿名内部类或内部类扩展,默认持有外部类 Activity 的引用:// 匿名内部类override fun onCreate(savedInstanceState: Bundle?) { ... val innerHandler: Handler =..原创 2021-09-30 22:42:43 · 342 阅读 · 0 评论 -
万字复盘 Handler 中各式 Message 的使用和原理
我们会经常使用 Handler 的 send 或 post 去安排一个延时、非延时或插队执行的 Message。但对于这个 Message 到底什么时候执行以及为什么是这样,鲜少细究过。本文将一 一盘点并起底个中原理!同时针对大家不太熟悉的异步 Message 和 IdleHandler,进行演示和原理普及,篇幅较大,慢慢享用。非延时执行 Message先在主线程创建一个 Handler 并复写 Callback 处理。 private val mainHandler = Handler(.原创 2021-09-25 22:26:28 · 896 阅读 · 2 评论 -
Looper 需要手动 quit,那主线程 Looper 呢?
我们会使用 quit() 或 quitSafely() 终止 Looper 线程的轮循,其背后的原理和细节,今日一并了解下。quit()子线程可以手动调用 quit() 退出轮循。// Looper.java public void quit() { // 默认是不安全的退出 mQueue.quit(false); }Looper 的调用实则由 MessageQueue 全权处理,包括:标记正在退出,并清空 Mesage,最后唤醒线程去处理。//.原创 2021-09-18 16:08:38 · 1107 阅读 · 0 评论 -
Handler 的 Message 实例怎么获得?为什么不是直接 new?
基本都是调用 obtain() 来获得使用 Message 的方式有很多种,无论是 Handler#obtainMessage() 还是 Message#obtain(),甚至是 Handler#postRunnable(),本质上都是调用 Message 的静态方法 obtain()。 public final Message obtainMessage() { return Message.obtain(this); } public final boole.原创 2021-09-13 23:59:31 · 381 阅读 · 0 评论