Android的消息机制概述

一、Android为什么提供Handler消息机制

在Android中不允许子线程访问UI,Handler可以解决这个矛盾

因为Android的UI控件不是线程安全,如果并发访问必然会产生不可预期的状态。
Handler的主要作用就是将一个任务切换到指定线程中去执行,使用Handler我们就可以把访问UI的任务切换到主线程

二、简述Handler的工作原理

  1. Handler的运行需要底层MessagQueue和Looper的支撑,
  • MessagQueue:消息队列。采用单链表的数据结构储存消息列表
  • Looper:消息循环。以无限循环的形式去查找是否有新消息,有就处理消息,没有就等待着
  1. 线程是默认没有Looper的,要使用Handler必须要为线程创建Looper

UI线程即ActivityThread,默认可以使用Handler。因为ActivityThread被创建时初始化了Looper

  1. 那么Handler内部如何获取当前线程的Looper呢?这时候就要使用ThreadLocal
    ThreadLocal的作用:在每个线程中储存数据

ThreadLocal可以在不同的线程中互不干扰的储存并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper

  1. Handler循环系统创建完毕后,Handler、MessageQueue、Looper就可以协同工作了。通过Handler的send方法将一个Runnable投递到Looper中去处理
  1. 当send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放在消息队列中
  2. Looper发现有新消息,就进行处理,最终消息中的Runnable或Handler的handleMessage方法被调用
  1. 由于Looper运行在创建Handler的线程中,所以Handler中的业务逻辑就被切换到Looper所在的线程中执行了

你可能感兴趣的:(Android的消息机制概述)