前言
本篇文章作为说说Android系列的正式开篇,计划用不定期时间将自己的Android知识梳理成一个体系。 作为对技术的一个总结和回顾,方便自己回过头来查找。
与君共勉,多坚持。
整体理解
Handler可以说是每一个Android开发的必会知识,不管是四大组件还是View体系又或者是启动流程,Handler在Android体系中可以说无处不在。
Handler是什么?
如果是面试中,或者测试小姐姐问你的话,我们该怎么描述呢?
个人理解:要把一个东西弄明白,就是要能用简单的语言解释清楚
粗浅定义: Handler是Android中线程间通讯的工具类和执行延迟任务的工具
线程间通讯的工具:子线程需要更新UI,一般做法就是通过主线程的Handler将更新逻辑抛到主线程执行
执行延迟任务工具: 延迟一段时间执行任务,比如倒计时,可以使用Handler中的post方法
Handler简单使用
Handler的使用这里简单介绍,大家都比较熟悉了:
//1 创建Handler
Handler handler = new Handler(); //传入looper对象,默认为代码执行时所在线程的looper对象
// 2 发送消息
Handler.sendMessage(Message); //发送消息(将任务抛到主线程可用)
Handler.sendMessageDelayed(Message, delayMills); //发送延迟一定时间的消息
Handler.postRunnable(Runnable); //发送一个任务 Runnable中就是执行的任务(执行延迟任务,Handler泄漏根源)
//3 处理Message
覆写Handler的 handleMessage方法,通过Message对象的what等标记处理对应的消息任务。
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
//处理消息任务
}
};
Handler机制理解
现在假设,让我们来实现一个线程间通讯的工具,我们该怎么实现呢?
1、线程间通讯需要一个媒介,用来在A B两个线程传递数据---Handler中的媒介就是Message对象
2、A-->B传递数据,数据发送肯定需要一个结构存储,如果A发送的过快,B来不及处理---队列
3、这个发送的消息要有一个顺序---按时间排序
4、B线程怎么知道A线程发过来的消息呢,B线程如何执行这个消息?
从上面我们也可以有一点启发,这个流程和 生产者/消费者模型 很像;
A线程就相当于生产者,生产消息内容发送到队列中,B线程相当于消费者,从队列中获取消息执行。
Android设计的Handler机制 使用的 生产者/消费者模型:
Handler机制简析
- Handler工具类,用来发送消息和延迟任务
- 任务的媒介是Message对象
- 任务队列:MessageQueue
- Looper:无限循环从MessageQueue中获取Message来执行
流程概述是这样的:
假设情况一: 线程A需要将一个任务抛到线程B中执行
- 线程A需要拿到线程B的Handler对象
- 线程A通过Message/Runnbale将任务封装,通过Handler.sendMessage发送出去[生产者的角色就是发送任务]
- Message被发送到线程B的MessageQueue队列中
- 线程B中的Looper无限循环从MessageQueue中拿到Message消息
- 拿到消息后通过Message.target来执行该消息(也是Handler)
单线程刷新机制
很多图形用户界面(GUI)都是单线程刷新机制,多线程刷新有很多不可预料的问题,多线程修改导致的死锁也导致代码难以维护。
对于Android来说,UI刷新需要在主线程进行。子线程更新UI的话就需要通过Handler将刷新逻辑抛到主线程。 事实上,我们知道Android可以说