Android中Handler从子线程发消息到主线程回调消息全过程

1.handler是干什么的?
我们在做一些耗时操作的时候,比如网络请求或者操作数据库等等,一般都会在子线程中进行操作,那么一般这些请求完成之后,就要实时刷新界面,而子线程不能刷新页面,只能在主线程进行操作,so,子线程怎么将消息发送到主线程进行页面刷新呢?
2.自己画的一张图,虽然有点丑,不过稍微能说明问题。
这里写图片描述
第一步:通过sendMessage方法,将消息体发送到消息队列。
第二步:Looper通过loop方法,将消息队列中的消息进行轮训。
第三步:将轮训到的消息回调handler的handleMessage方法。
3.消息是怎么回调到主线程中的呢?
因为Looper.loop()是在主线程中运行,所以可以直接运行在主线程。
通过源码可以解释。UI线程在启动的时候就初始化了Looper对象并开始了消息的轮询。
在ActivityThread.java中的main方法中调用了Looper.prepareMainLooper(),这个方法包括两个过程,
第一,将当前线程存储到ThreadLocal中。ThreadLocal是一个map数据结构,多个线程公用一个ThreadLocal对,通过key-value键值对存储进去,之后调用get的时候保证每次获得的都是自己的线程,主要作用是进行数据隔离。
第二,通过sThreadLocal.get()初始化looper对象。
其实上面三步可以总结成一句话:子线程发消息,主线程取消息。
4.消息的轮询。
在ActivityThread.java中,有个Looper.loop()方法,于是就开始了消息了轮询。这个方法有个死循环,不停的取消息,并通过msg.target.dispatchMessage(msg)来回调主线程中handleMessage方法,其中target是handler对象,而dispatchMessage中调用了handleMessage方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值