梳理Handler,Looper,MessageQueue的关系

首先,这三个的关系还得再加上一个,那就是线程。Handler在创建的时候,会传入一个Looper的对象,默认不传的话,就是主线程中创建的Looper(为什么主Looper不需要调用Looper.prepare() 呢,因为在创建Activity或者Fragment的时候,安卓环境帮我们主动做了处理,所以不需要手动写)。传入的Looper用于遍历MessageQueue获取Message。如果是在子线程中创建Hander(例如:HandlerThread),就需要三步完成Hander的创建。

第一步:执行Looper.prepare(),他的作用是创建一个Looper对象,放到当前线程的ThreadLocal中,一个线程对应一个Looper对象。

第二步:创建一个Hander,创建的时候,把上一步创建的Looper对象传进去,获取创建的Looper对象的方法是Looper.myLooper()。

第三步:执行Looper.loop()方法,他的作用是让Looper遍历MessageQueue,从中取出Message,获取到Message,也就获取到了Hander,因为Message的target就是发送它的Handler,也就是上面创建的Handler。获取到Handler,执行hander对象的dispageMessage方法,这个方法会调用Hander的handleMessage方法,至此,就找到了我们创建Hander需要重写的方法。

 

关联类介绍:

HandlerThread:

主要用户两个子线程之间的通信。

使用方法:

1、创建一个HandlerThread对象,执行start方法,既启动一个子线程。

2、常见一个Handler,传入的Looper是通过HandlerThread对象获取得到的。

3、在子线程中发送消息,第二步中的Handler就会收到消息。

IntentService的介绍:

之所以说IntentService中的HandlerThread,是IntentService的工作线程,是因为IntentService中的Handler创建的时候,传入的是HandlerThread内部的Handler。 这样启动IntentService的时候,执行onStartCommand方法,onStartCommand会调用onStart方法,这时候就把Intent当作数据传让Handler发出去了。然后就是遍历MessageQueue。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值