写点什么

Handler 简单入门

用户头像
W🌥
关注
发布于: 8 小时前
什么是 handler?

handler 准确来讲是 handler 机制,handler 只是这个机制中的一个角色。它的本质是消息机制,负责消息的分发以及处理。它可以在新启动的线程中发送消息,也可以在主线程中获取、处理消息。handler 机制相当于提供了一套模式,放什么消息、以及怎么处理消息,是需要我们自定义的。

为什么需要 handler(handler 的应用场景 / 其必要性)?

Android 开发中有两个很关键的问题:一是不能再主线程中执行耗时任务(比如网络请求、数据库操作,会导致 ANR),二是不能在子线程中去操作 UI(会产生不可预期的结果,强行加锁的话会使界面卡顿)。故可以用 handler 来实现子线程执行耗时操作,切换回主线程更新 UI 的效果。

如何使用 handler?

(1)创建 Looper(2)使用 Looper 创建 Handler(3)启动 Looper(4)使用 Handler 发送信息

handler 原理?

Handler 主要由四个部分组成。首先是 Message,Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程间交换数据。其次是 MessageQueue,就是消息队列,它用来存放所有通过 Handler 发送过来的消息。每个线程只有一个 MessageQueue。再然后是 Looper,调用 Looper 的 loop 方法后,就进入一个无限循环中,每当 MessageQueue 中存在一条消息,Looper 就会将这条消息取出,并传递到 Handler 的 handlerMessage 方法中,同消息队列,每个线程中也只有一个 Looper 对象。最后就是 Handler,顾名思义这就是 Handler 机制的处理者,它用于在子线程中发送消息对象,在 UI 线程中处理消息对象。运行机制即为:主线程中创建一个 Handler 实例对象,然后重写其 handlerMessage 方法,其中编写接收消息后的 UI 线程的处理操作。在子线程需要更新 UI 的时候,新建一个 Message 对象,然后通过 Handler 实例对象的 send 或 post 方法把消息发送出去。之后这个消息被保存在 MessageQueue 中等待被处理。Looper 在不停的把 MessageQueue 中存在的消息取出来,通过回调 dispatchMessage 方法把消息传递给 Handler 的 handlerMessage 方法,最终得到处理。

looper 是怎么轮询的?

当 Looper 初始化完成后,需要调用 Looper 的 loop()方法来启动 Looper。loop()方法是一个死循环,不断调用 MessageQueue 的 next 方法来获取新消息,然后调用 message 的目标 handler 的 dispatchMessage()来处理这个消息。我们知道 MessageQueue 的 next 方法是可能会进行阻塞的:当 MessageQueue 为空或者目前没有任何消息需要处理。所以 Looper 就会一直等待,阻塞在里,线程也就不会结束。当我们退出 Looper 的时候,next 方法会返回 null,那么 Looper 也就会跟着结束了。

主线程的 Looper 是一个死循环,为什么不会 ANR?

Looper 处理完消息进入的是阻塞状态,当有新的 Message 来的时候会打破阻塞继续执行。真正会卡死主线程的操作是在回调方法 onCreate/onStart/onResume 等操作时间过长,会导致掉帧,甚至发生 ANR,looper.loop 本身不会导致应用卡死。

能在子线程中创建 handler 吗,如何创建?

子线程不能直接 new 一个 Handler,因为 Handler 的工作依赖于 Looper,而线程默认是没有 Looper 的。所以在线程中使用 Handler 时必须要保证当前线程中有 Looper 对象并且启动循环,即调用了 loop 方法。如何创建?通过 Looper.prepare()即可为当前线程创建一个 Looper,接着通过 Looper.loop()来开启消息循环。

主线程为什么不用自己创建 looper?

因为应用在启动的过程中就已经初始化主线程 Looper 了。Android 程序的入口在 ActivityThread 的 main 方法中,main 方法中先初始化主线程 Looper,新建 ActivityThread 对象,然后在启动 Looper。这样主线程的 Looper 在程序启动的时候就跑起来了,我们无需自己去初始化。

发布于: 8 小时前阅读数: 4
用户头像

W🌥

关注

还未添加个人签名 2021.08.04 加入

还未添加个人简介

评论

发布
暂无评论
Handler简单入门