读书笔记:Android的消息机制

阅读的书籍:《Android开发艺术探索》

关键词:Android的消息机制概述、分析,主线程的消息循环

Android的消息机制概述:Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper                                            的工作过程

Handler是 Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可,它不是专门用来更新UI的,只是经常被我们用来更新UI

Handler出现的原因:

Android规定访问UI只能在主线程中进行,主线程中不能进行耗时的操作(ANR);但比如有时我们需要从服务器拉取数据,然后得到数据后更新UI,由于这是个耗时操作,所以不能在主线程中进行,但更新UI又只能在主线程,这就出现了矛盾

Handler的主要作用:将一个任务切换到某个指定的线程中执行,任务结束后再切换回主线程更新UI

Handler的工作原理:

Handler创建时会采用当前线程的Looper来构建内部的消息循环系统,如果当前线程没有Looper就会报错

  • 可以通过Handler的post方法将一个Runnable投递到Handler内部的Looper中去处理
  • 也可以通过Handler的send方法发送一个消息到Looper中去处理

可以看到post方法最终也是通过send方法来完成的

Handler的send方法的工作过程:

当Handler的send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中,然后Looper发现有新消息到来时,就会处理这个消息,最终消息中的Runnable或者Handler中的handleMessage方法就会被调用

Looper是运行在创建Handler所在的线程中的,如此一来Handler中的业务逻辑就被切换到了创建Handler所在的线程(通常就是主线程)去执行了

Android的消息机制分析:Handler,MessageQueue,Looper和ThreadLocal

ThreadLocal的工作原理

ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据;数据存储以后,只有在指定线程中才可以获取到存储的数据,对于其他线程来说则无法获取到该数据

使用场景:

  1. 当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候:比如说Looper
  2. 复杂逻辑下的对象传递,如监听器的传递

案例:

如上,在主线程中设置mLocal为true,在子线程1中设置为fasle,而在子线程2中不设置

来看一下输出结果:

可以看到,虽然不同线程中访问的是同一个ThreadLocal对象,但是它们通过ThreadLocal获取到的值是不一样的

原理:

不同线程访问同一个ThreadLocal的get方法,ThreadLocal内部会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引取出对应的value值

ThreadLocal的内部实现:

从set和get方法可以看出,在ThreadLocal内部是将数据存储在ThreadLocalMap中的,而在ThreadLocalMap中真正负责存储的则是一个名为table的Entry数组,最终是通过键值对来进行存和取

消息队列的工作原理

MessageQueue内部是通过一个单链表的数据结构来维护消息列表

它的next方法是一个无限循环的方法,如果消息队列中没有消息,那么next方法会一直阻塞在这里;当有新消息到来时,next方法会返回这条消息并将其从单链表中删除

Looper的工作原理

Looper的任务是消息循环,它会不停地从MessageQueue中查看是否有新消息,如果有新消息就会立刻处理,否则就一直阻塞在那里

Handler的工作需要Looper,没有Looper的线程会报错

  • 创建Looper:Looper.prepare(),Looper.prepareMainLooper()(给主线程使用的,本质也是prepare)
  • 开启消息循环:Looper.loop()
  • 退出循环:Looper.myLooper().quit(), Looper.myLooper().quitSafely()

quit和quitSafely的区别:quit会直接退出Looper,quitSafely会把消息队列中的已有消息处理完毕后才安全的退出

Looper中最重要的一个方法就是loop方法,它是一个死循环,唯一跳出循环的方式是MessageQueue的next返回了null

在不需要的时候,记得终止Looper

Handler的工作原理

Handler的工作主要包含消息的发送和接收,Handler发送消息的过程仅仅是向队列中插入了一条消息

主线程的消息循环:Android的主线程就是ActivityThread

主线程的消息循环模型:

 

 

 

 

 

©️2020 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值