说说Android---Handler

79 阅读3分钟

前言

本篇文章作为说说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机制 使用的 生产者/消费者模型:

image.png

Handler机制简析

  1. Handler工具类,用来发送消息和延迟任务
  2. 任务的媒介是Message对象
  3. 任务队列:MessageQueue
  4. Looper:无限循环从MessageQueue中获取Message来执行

流程概述是这样的:

假设情况一: 线程A需要将一个任务抛到线程B中执行

  1. 线程A需要拿到线程B的Handler对象
  2. 线程A通过Message/Runnbale将任务封装,通过Handler.sendMessage发送出去[生产者的角色就是发送任务]
  3. Message被发送到线程B的MessageQueue队列中
  4. 线程B中的Looper无限循环从MessageQueue中拿到Message消息
  5. 拿到消息后通过Message.target来执行该消息(也是Handler)

单线程刷新机制

很多图形用户界面(GUI)都是单线程刷新机制,多线程刷新有很多不可预料的问题,多线程修改导致的死锁也导致代码难以维护。

对于Android来说,UI刷新需要在主线程进行。子线程更新UI的话就需要通过Handler将刷新逻辑抛到主线程。 事实上,我们知道Android可以说