Android面试题

【知识】Handler相关

2019-12-30  本文已影响0人  FynnJason

原创不易,尊重作者,转载请注明出处

目录

Handler原理

handler原理主要可以通过5个类和3个步骤来讲清楚。

5个类

Message:消息,包含了消息ID、消息处理对象以及处理的数据。

Handler:处理者,负责Message的发送和处理,在使用Handler时,需要实现handleMessage方法来对特点的Message进行处理。

MessageQueue:消息队列,用来存放Handler发送过来的消息,遵循先进先出的原则,将Message以链表的方式串联起来,等待Looper抽取。

Looper:消息泵,不断从MessageQueue中抽取Message执行。

Thread:线程,负责调度整个消息循环。

3个步骤

Handler创建消息:Handler创建消息时首先查询消息池中是否有消息存在,如果有消息存在,直接从消息池中取出,如果没有消息存在,则会重新初始化一个消息实例。

Handler发送消息:Handler通过sendMessage发送消息时,UI主线程会判断是否创建过Looper,如果没有创建过Looper,会通过ThreadLocal创建一个Looper,如果创建过Looper,则直接使用ThreadLocal之前创建的Looper,当Looper创建的时候会创建一个消息队列MessageQueue,消息队列会存放Handler发送的消息。

Handler处理消息:UI主线程会通过Looper循环查询消息队列MessageQueue,当发现有消息存在时会将消息取出,然后分析消息的参数,判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

结论

通过以上5个类和3个步骤,基本可以理解Handler的原理。

子线程一定不能更新UI吗

不是。大多数情况下,子线程是不能更新UI的,但是以下两种情况,子线程可以更新UI。

支持在子线程更新UI的控件

在Android中,有支持在子线程中更新UI的控件,例如:SurfaceView。

在特定的生命周期可以实现子线程更新UI

在Activity的onResume生命周期之前,是可以在子线程中更新UI的。

Handler内存泄露

请参考我的另一篇文章:
内存泄露

一个线程是否可以创建多个Handler

可以。

Handler与Looper的关系

Handler与Looper的关系可以理解成Handler、MessageQueue、Looper的关系,在一个线程中,结构是一个Looper、一个MessageQueue和多个Handler。

上一篇下一篇

猜你喜欢

热点阅读