Android面试题——掘金-Framework之Handler(2)
一 概述
1 | 关于 Android Framework 中的 Handler, |
二 面试题解答(仅供参考)
2.1 Handler 机制的基本原理?
1 | Handler 主要用于线程间通信,基于消息队列(MessageQueue)和循环器(Looper)进行消息调度。 |
2.2 为什么主线程(UI 线程)默认有 Looper,而子线程默认没有?
1 | -主线程在 ActivityThread.main()方法中调用了Looper.prepareMainLooper(),所以主线程默认有Looper。 |
2.3 MessageQueue 为什么不会阻塞 UI 线程?
1 | -MessageQueue 采用 阻塞式等待 机制 (next() 方法) 处理消息, |
2.4 Handler 可能引起内存泄漏吗?如何避免?
1 | 可能会,尤其是在 匿名内部类 Handler 持有 Activity 引用 时,导致 Activity 无法被 GC 回收。 |
2.5 Handler.postDelayed() 和 Thread.sleep()的区别?
Handler.postDelayed() | Thread.sleep() | |
---|---|---|
原理 | 发送延迟消息到 MessageQueue | 线程直接休眠 |
影响 | 不影响 UI 线程的其他任务执行 | 会阻塞当前线程 |
适用场景 | 需要延迟执行任务,但不阻塞线程 | 需要暂停线程执行 |
2.6 Handler允许跨线程通信的原因?
1 | -Handler依赖于Looper和MessageQueue,而MessageQueue是线程安全的,可以接受来自不同线程的消息。 |
2.7 如何在子线程创建 Handler?
1 | 必须手动创建 Looper 并启动 Looper.loop(),示例如下: |
2.8 HandlerThread 的作用?与普通线程的区别?
1 | HandlerThread 是 带有 Looper 的线程,适用于 后台任务,示例 |
2-相比普通线程
普通线程 | HandlerThread | |
---|---|---|
Looper | 默认无 | 自带 Looper |
消息队列 | 无 | 自带MessageQueue |
生命周期 | 线程结束即销毁 | 可以复用 |
2.9 为什么 Handler 不能跨进程通信?
1 | Handler依赖于进程内的Looper和MessageQueue,不同进程的Looper互不相通,导致Handler无法跨进程通信。 |
2.10 为什么 Looper.loop() 是一个死循环,但不会导致 ANR?
1 | -Looper.loop() 是 无限循环,但它 不会占用 CPU, |
三 参考
- 知乎—知识库的大纲