Handler机制中ThreadLocal的作用

以前看过handler的原理, 但时间一长, 其基本原理又忘记的差不多了, 看了博客(转)深入理解之 Android Handler(相当好!!!)之后, 对handler有了更深刻的理解. 

但是一直有些疑问. 深入理解之 Android Handler中提到: Looper是MessageQueue的管理者. 每一个MessageQueue都不能脱离Lopper而存在, Looper对象的创建

是通过prepare函数实现的. 同时每一个Looper对象和一个线程关联.

 

第一个疑问:一个普通的activity中创建的handler是如何跟当前UI线程关联起来的呢

接下来看Handler构造方法:

在上面的构造函数中,Handler中的消息队列指向Looper的消息队列. 这句话是关键, 为何?

在这里Looper的消息队列是属于UI线程的消息队列. 所有我们往消息队列发送消息, 实际上是往UI线程的MessageQueue发送消息, 

自然而然就, 消息就通过UI线程来处理. 

第二个问题: 这里的Looper.myLooper()为何就是UI线程Looper呢, UI线程是如何与Looper关联起来的呢.

继续搜索myLooper()的实现:

这里仅仅返回的是一个looper. 然后继续查看Threadlocal(Threadlocal位置在:libcorelunisrcmainjavajavalangThreadLocal.java )的实现

看到get的实现, 估计知道为什么这里的looper就是UI线程的looper了吧.

ThreadLocal以UI线程为KEY , 以Looper为值这样就把一个线程和一个looper关联起来了.

结论: 在activity的非UI线程中, 通过handler发送消息实际上是往UI线程的消息队列发送消息.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值