Handler一定要在主线程跑?和脱离主线程及HandlerThread的疑惑 (二)

本文介绍了Android系统中的消息处理机制,重点讲解了Handler、Looper和MessageQueue之间的关系。Android应用是消息驱动的,每个线程可以有自己的消息队列和循环。Handler用于将消息放入特定线程的消息队列,Looper负责消息循环。主线程默认有Looper,其他线程需要通过Looper.prepare()和Looper.loop()创建。工作线程可以通过Handler向主线程发送消息以更新UI,需要注意线程同步问题。深入理解这一机制对Android开发至关重要。
摘要由CSDN通过智能技术生成

很多人在问我 Handler, Looper, MessageQueue, 之间的关系啥的, 本来想自己写写, 但是看到上文, 觉得已经写得不错了. 于是拿来用之, 具体的东西, 还是得看源码帮助理解, 别人讲, 是讲不清的. 全文如下:

 

        熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。本文深入介绍一下Android消息处理系统原理。

       Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。

       前面提到Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示:

复制代码
class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值