线程中Handler和Looper的理解

本文深入解析Android消息循环机制的核心概念,包括Looper、MessageQueue和Handler的交互方式,通过源码分析和实践案例,详细阐述如何在多线程环境下实现消息的有序处理。了解Looper的启动、循环过程以及退出机制,掌握Android内部消息处理的底层逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上没有什么比较好的例子,往往给出的都是这样的代码

 LooperThread Thread {
    Handler mHandler;

    run() {
     Looper.prepare();

     mHandler = Handler() {
        handleMessage(Message msg) {
         
       }
     };

     Looper.loop();
   }
 }


然后在一开始就对这个线程的实例调用start(),当需要其处理数据时,往这个线程中的mHandler发送message即可。

就这么看的话,确实不是很理解,网上的解释是给出源码一条一条解释给你看。可是要真正理解还是要自己去看一看源码,然后自己写个demo试试。

通过代码可以知道,Looper作为一个消息泵,在主线程中已经默认设置好了。如果在其他线程也想实行类似的消息处理机制,就要像上面的例子一样继承Thread重写,同时,一个线程只能有一个Looper,对应一个MessageQueue。

而只所以其中可以进行循环不断地消息处理,是因为在Looper.loop()里,实行了一个for( ; ; )的无限循环,而在这个循环里的判断,通过看源码得知,Looper中自己维护的MessageQueue中的next()方法中也有一个for( ; ; )循环,在其中,只要不收到quit的消息,就不会跳出循环给出返回值,这样loop()就会一直在等到有消息进来。所以在退出该线程时需要调用到Looper的quit()方法。

这里的looper的quit也有区别,分别是quit()和quitSafely()方法,区别就是前者直接退出,清空queue中的所有信息,后者会将还在MessageQueue中的非延迟信息处理了,然后清空所有延迟信息(delayed),然后再退出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值