Android中的消息机制

消息机制的概述

1、Handler的主要作用是将某个任务切换到Handler所在的线程中去执行。Handler可以通过post方法发送一个Runnable到消息队列MessageQueue中,也可以通过send方法发送一个消息到消息队列中,其实post方法最终也是通过send方法来完成,系统会将post的内容打包成一个Message,再通过send方法发送出去。
2、Looper会以无限循环的形式去查看MessageQueue中是否有新消息,如果有就处理消息,最终消息中的Runnable或者Handler的handleMessage方法就会被调用,注意Looper是运行Handler所在的线程中的,这样一来业务逻辑就切换到了Handler所在的线程中去执行了。
3、Handler创建时会采用当前线程的Looper来构建内部的消息循环系统,如果当前线程没有Looper就会报错,Handler是通过ThreadLocal获取获取只针对当前线程的Looper,ThreadLocal是一个线程内部的数据存储类,他的作用是可以在每个线程中存取数据。
4、线程默认是没有Looper的,所以需要为线程创建Looper,但UI线程会自动初始化Looper

这几个类之间的关系:
image

ThradLocal

ThreadLocal是一个线程内部的数据存储类,通过它可以在指定线程存储数据,数据存储后,只能在指定的线程可以获取到存储的数据,对于其他线程则无法获取到数据。一般来说,当数据是以线程作为作用域并且不同线程有不同副本的时候,就可以考虑使用ThreadLocal。对于Handler来说,它需要获取当前线程的Looper,而Looper就是作用于线程,并且不同的线程具有不同的Looper,通过ThreadLocal可以轻松实现线程中的存取。

即不同的线程访问同一个ThreadLocal对象,它们通过对象获取的值是不一样的

实现原理

ThreadLocal mThreadLocal = new ThreadLocal;
有get set 方法
不同线程访问同一个ThreadLoacl的get方法,ThreadLocal的get方法会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查找对应的Value值。
set
获取到当前线程,并从当前线程中取出对应的ThreadLocalMap(内部由Entry[] table来存储ThreadLoacl的值),再把相应数据存入其中。如果ThreadLocalMap为空,则创建该线程的ThreadLocalMap对象,再将ThreadLocal的值进行存储。
get
获取当前线程,并从当前线程中获取对应的ThreadLocalMap,通过key获取对应的value;如果未获取到对应的ThreadLocalMap,则创建并将该对象返回。
ThreadLocal的值在table数值中的位置总是ThreadLocal的索引+1。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值