Handler切换线程的原理

先看一个使用Handler来切换线程的demo:
在这里插入图片描述在这里插入图片描述
该demo中在主线程中创建了一个handler,在子线程里面创建Runnable对象,在子线程中用handler的post(Runnable runnable)操作来发送消息。我们看看打印出来的结果:

1.	05-28 21:34:23.891 21509-21509/mountain_hua.learn_handler1 I/System.out: main thread id 1  
2.	05-28 21:34:23.893 21509-21560/mountain_hua.learn_handler1 I/System.out: run thread id 9378  
3.	05-28 21:34:24.894 21509-21509/mountain_hua.learn_handler1 I/System.out: Runnable thread id 1  

可以看到Runnable的run方法里打印的线程id与onCreate方法的main线程id相同,说明了在子线程调用handler的post方法,虽然Runnable对象是在子线程中实例化的,但Runnable的run方法仍然是运行在主线程中。

接下来通过源码来分析Handler切换线程的原理:
首先看Handler的构造方法:
在这里插入图片描述
在这里插入图片描述
关键就在mLooper = Looper.myLooper(),因为Looper.myLooper()是得到当前线程对应的Looper:
在这里插入图片描述
在这里插入图片描述
可知,Looper.myLooper()是得到的是当前线程对应的Looper。
而handler.post(runnable)是首先从消息池得到消息或新建一个消息,然后把runnble赋给消息的callback变量,然后把消息加入到Handler构造方法里得到的当前线程对应的消息队列中,然后在loop()的死循环里调用当前线程的Looper里的消息队列里的消息的Runnable的run方法,则该run方法里运行的当然是该线程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值