Handler,Looper,MessageQueue,Message 原理

本文详细解析了Android中Looper与Handler的工作原理,包括Looper.prepare()与Looper.loop()的作用,Handler如何通过MessageQueue机制实现线程间通信,以及Looper、Handler、MessageQueue之间的关系。

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

前置知识

1.Thread的run方法和start方法区别

直接调用run方法,run中的内容并不会另起一个线程运行,只有调用start方法才可以

2.ThreadLocal

ThreadLocal 的get方法会获得 Threadlocal在相应线程set的值。

----------------------------------------------------------------------------------------------------------------------------

1.Looper 这个类内部有一个 

sThreadLocal 的静态成员变量

2.new Handler的时候会在handler内部给mLooper赋值,

mLooper = Looper.myLooper();

最终用的是Looper内部这个静态成员变量的sThreadLocal.get()方法,

3.如果这个sThreadLocal 在当前线程下没有获取到looper,则证明

Looper.prepare()在该线程下没有被调用过

4.这样,每个线程就都有自己的Looper

5.在new Handler 的时候 ,该handler还会获取当前线程先对应的looper的mQueue赋给

handler的成员变量mQueue

6.当调用一个成功创建了的handler 的post 方法时,最终会调用该handler的queue

的enqueueMessage方法 也就是looper的queue的方法,该方法将会把handler作为target变量存入message中

7.Looper.prepare()方法做了两件事

(1)new了一个Looper

new Looper又可以细分为 new 了一个MessageQueue

以及赋值Thread.currentThread()给mThread这个变量

(2)将这个Looperset到Looper类的threadLocal变量中

8.Looper.loop()方法

把queue给运行起来,相当于一个死循环,在不停的从queue中取出来msg

msg将会调用msg的target(即handle)的dispatchMessage方法

该方法最终会调用 handler的handleMessage方法

 

总结  1.Looper.prepare Looper.loop后 ,messagequeue的无限循环就开始了

         2. 该循环从messagequeue中取出message,message再调用其target(Handler)的dispatchMessage方法,

         最终调用handleMessage方法。

 

Handler      Message       MessageQueue        Looper 

自己看源码分析,比看别人写的乱七八糟的文章管用的多。

=========================

拓展:

HandlerThread    自带looper的Thread

ActivityThread     主线程

 

Handler,MessageQueue的这种机制其实就是是生产者,消费者机制

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值