开发艺术探索 -- Android中的消息机制

来源:互联网 发布:直播系统源码 编辑:程序博客网 时间:2024/05/01 19:09

第十章,Android中的消息机制

消息机制概述
消息机制分析
主线程的消息循环

之前的总结 关于Android中的Handler 机制

消息机制概述

  1. Android消息机制的上层接口就是Handler.
  2. Handler需要MessageQueue,Looper做支撑.
  3. Handler创建的时候会采用当前线程的Looper,涉及到ThreadLocal
  4. Handler的作用是将一个任务切换到指定的线程执行
  5. ViewRootImpl#checkThread会对ui操作进行验证.
  6. 为甚不能再子线程访问ui(Android ui单线程模型,防止ui访问逻辑复杂和效率低下)

消息机制分析

  1. ThreadLocal是一个线程内部的数据存储类
  2. MessageQueue包含插入读取操作,插入本身会伴随着删除操作
  3. 插入读取分别对应着enqueueMessagenext方法
  4. MessageQueue并不是队列数据结构,而是一个单链表
  5. Looper扮演着消息循环的角色,不停地查看MessageQueue中是否有新消息
  6. Looper.prepare即可为当前线程创建Looper,通过Looper.loop即可开启循环
  7. prepareMainLooper是为主线程ActivityThread创建Looper
  8. Looper提供了quit(立即退出) 和 quitSafely(消息执行完安全退出) 来退出一个Looper
  9. Looper退出后,sendMessage返回false,发送消息失败.
  10. 在子线程中创建的 Looper,建议不需要时 手动退出
  11. Looper#quit调用后MessageQueue#next返回null,跳出循环.

Handler工作原理

Handler发送一条消息,则MessageQueuenext就会返回这条消息的Looper,Looper接到消息后就会调用Handler#dispatchMessage来处理消息了.

Handler处理消息的过程:

  1. 检查 message.callback 是否为null,不为null,则handleCallback
  2. 检查 mCallBack 是否为null,不为 null,则调用mCallBack.handleMessage
  3. mCallBack.handleMessage返回false或者没有没有mCallBack,调用 Handler#handleMessage

通过CallBack创建Handler可以创建一个Handler实例,而不用派生Handler的子类

主线程的消息循环

  1. Android中的主线程就是ActivityThread,入口是main,其会调用Looper.prepareMainLooper来创建主线程的LooperMessageQueue,并通过Looper.loop来开启消息循环.
  2. 主线程消息循环开启后, ActivityThread还会开启一个ActivityThread.HHandler来和消息队列进行交互.ActivityThread.H内部还定义了四大组件启动和停止相关消息.
0 0