Android的消息机制(1-Android的消息机制概述)

 

Android消息传递机制最重要的就是Handler了,Handler的使用过程很简单,通过Handler可以简单的切换一个任务到Handler所在的线程中。Handler的一大作用是更新UI,但这不是他的全部作用,只是Handler使用的一个特殊的场景。使用的地方有:1、在子线程中进行耗时的I/O操作,2、网络操作,3、文件读取操作,4、其他耗时操作 当操作完成后需要更新UI的时候,使用Handler切换到主线程进行更新UI。因为Android开发规范限制不许在子线程进行UI更新,因此一般使用Handler切回到主线程。不是Handler专门用于UI更新,只是开发者经常使用他进行UI更新。

Android的运行机制主要是指Handler的运行机制,handler运行需要底层的MessageQueue和Looper支持。

  • MessageQueue是handler运行的一个消息队列,虽然直接翻译是消息队列,但实际上messageQueue不是队列,而是一个单链表的数据结构。
  • Looper的翻译为循环,是消息循环的意思。Looper会以无限循环的形式去遍历MessageQueue,查看是否有新消息需要处理,如果有的话就处理消息,如果没有就阻塞等待。1、Looper中还有一个需要注意的是ThreadLocal,它不是线程,他的作用是再不同的线程互不干扰的存储数据,通过ThreadLocal可以简单的获取每个线程的Looper。2、Handler不是线程中默认存在Looper的,如果需要使用Looper需要在线程中创建。主线程也就是UI线程是activityThread,activityThread被创建时会初始化Looper,所以主线程默认有Looper。
  • Android的UI不许子线程更新的相关知识点
  1. 因为Android的UI控件不是线程安全的,如果在多线程并发访问UI控件,会导致控件处于不可控状态;
  2. 系统不能对UI控件加锁机制,而采用限制线程的,因为①加上锁会导致逻辑变得复杂②加上锁会降低UI访问效率,锁会阻塞线程。因此最简单高效的方式就是采用单线程来进行UI操作。对开发者来说就是切换下线程也不会造成太多工作
  3. 因此ViewRootImpl会在cheakThread的时候验证要操作UI的线程是否为主线程,若非主线程访问UI会抛出提示。
  •  Handler的使用
  1. 创建Handler对象,将handler对象传递给要发送消息的线程或者地方。注意Handler可以①使用静态类的方式;②在activity退出时清空队列,注销handler;③采用弱引用来避免内存泄露
  2. 使用handler.post()方法或者handler.send()方法发送一个消息(Message)。post调用的也是send(sendMessageDelayed)方法发送。
  3. 在Handler实现类中获取消息,处理消息实现反应。