Android 面试(五):探索 Android 的 Handler

发布时间:2019-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Android 面试(五):探索 Android 的 Handler脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

这是 面试系列 的第五期。本期我们将来探讨一下 AndROId 异步消息处理线程 —— Handler。

往期内容传递:
Android 面试(一):说说 Android 的四种启动模式
Android 面试(二):如何理解 Activity 的生命周期
Android 面试(三):用广播 BroadcastReceiver 更新 UI 界面真的好吗?
Android 面试(四):Android Service 你真的能应答自如了吗?

开始

Android 的消息机制,也就是 Handler 机制,相信各位都已经是烂熟于心了吧。即创建一个 Message 对象,然后借助 Handler 发送出去,之后在 HandlerhandleMessage() 方法中获取刚才发送的 Message 对象,然后在这里进行 UI 操作就不会出现崩溃了。

既然 Handler 操作都烂熟于心,还讲这个干什么?

嗯,对,在 Android 开发中,我们确实经常用到它,对于基本代码流程自然也是倒背如流,但了解它的原理的人却不是很多,所以面试官通常会考验你对 Handler 码机制的理解,毕竟只有知己知彼,才能百战不殆嘛。

我们都知道子线程中进行 UI 操作会阻塞主线程,通常是怎么在子线程更新 UI 的?

  • Handler

  • ActivITy.runOnUiThread()

  • View.post(Runnable r)

讲讲 Handler 机制吧

Handler 主要由以下部分组成。

  • Handler

Handler 是一个消息辅助类,主要负责向消息池发送各种消息事件Handler.sendMessage() 和处理相应的消息事件Handler.handleMessage()

  • Message

Message 即消息,它能容纳任意数据,相当于一个信息载体。

  • MessageQueue

MessageQueue 如其名,消息队列。它按时序将消息插入队列,最小的时间戳将被优先处理。

Looper 负责从消息队列读取消息,然后分发给对应的 Handler 进行处理。它是一个死循环,不断地调用 MessageQueue.next() 去读取消息,在没有消息分发的时候会变成阻塞状态,在有消息可用时继续轮询。

在 Android 开发中使用 Handler 有什么需要注意的

首先自然是在工作线程中创建自己的消息队列必须要调用 Looper.PRepare(),并且在一个线程中只能调用一次。当然,仅仅创建了 Looper 还不行,还必须使用 Looper.loop() 开启消息循环,要不然要 Looper 也没用。

我们平时在开发中不用调用是因为默认会调用主线程的 Looper。
此外,一个线程中只能有一个 Looper 对象和一个 MessageQueue 对象。

大概的标准写法是这样。