Android-Handler机制简述

简介

Handler机制是一套Android信息传递机制,在Android开发多线程的应用场景中,将工作线程中需要更新的UI操作传递到主线程,从而实现工作线程对UI的更新处理,最终实现异步信息的处理。

关于为什么只能在主线程中进行UI更新操作,主要原因就是如果有多个线程对UI进行操作,而UI操作本身又是线程不安全的,很容易造成UI操作的结果不确定性。因此只能在主线程进行UI操作本质上是一种维护线程安全的做法。

概念

主线程(UI线程,MainThread)

当用户程序第一次启动时会自动开启一条主线程,用于处理UI相关的事件和操作。是会产生ANR的线程。

子线程(工作线程)

人为手动开启的线程,用来执行耗时操作(网络请求、数据加载等)。

消息(Message)

线程间通讯的数据单元,也就是Handler实际发送的消息对象。用于传递需要操作的通信信息。

消息队列(Message Queue)

一个先进先出的数据结构,存储Handler发送过来的消息。并且按照消息队列的先进先出顺序发送到Looper中。

MessageQueue实际上使用的数据结构是单向链表(对于这种问题只要考虑其根本就好了),其原因就是为了维护有序的时间顺序,加快数据插入时的效率。

处理者(Handler)

Handeler为主线程与子线程的通信媒介,是线程信息的主要处理者。

用于把消息添加Message给 Message Queue,让Looper不断循环调用分派消息。

并且另一个作用就是处理Looper分配过来的消息。

循环器(Looper)

消息队列和处理者的中间通信媒介,用于消息循环,也就是一个中间人的角色,主要有两个职责:

消息获取:循环从消息队列中获取数据。
消息分发:将获取到的数据分发给对应的处理者。

每个线程只能拥有一个Looper,一个Looper可以绑定多个Hander,也就是多个线程可以往一个Looper所持有的Meesage Queue中发送数据。

值得注意的是,每个Handler发送数据时都是发送给MessageQueue,而不是直接发送给Looper。

工作流程:

1 异步通信前准备:

在进行通信之前要先把需要的对象创建出来,也就是:

创建Looper、MessageQueue、Handler对象

值得注意的是,Looper、Message Queue是主线程中的,创建Message Queue之后,Looper会自动进入循环模式,从消息队列中取出消息并处理。

此时:Handler自动绑定了主线程的Looper,Message Queue。

2 消息入队

通过Handler发送的消息自动进入到消息队列中,Looper对消息进行获取发送。

消息内容指的就是子线程对主线程的UI操作。

3 消息循环

消息的循环分为两个部分:

消息出队:Looper在消息队列中取出消息

消息分发:Looper将取出的消息发送给对应的可以接收的Handler

在消息循环中,若消息队列为空,则Looper会陷入死循环,这里有个为什么陷入死循环就不会ANR的问题。

这个问题就是Looper的时候实际上是线程阻塞着,而ANR的产生时线程运行时5秒未响应。

4 消息处理

Handler接收循环器的Looper发送过来的消息并进行处理。

5 Handler、Message Queue、Looper的数量关系

一个线程只能绑定一个Looper,但是可以有多个Handler。

一个Looper可以绑定多个Handler。

一个Handler只能绑定一个Looper。

一个线程中也只能有一个Message Queue.

Guess you like

Origin blog.csdn.net/Nimrod__/article/details/115299164