从源码了解handler looper ,messageQueue思路

本文通过一个简单的示例,详细解析了Looper与Handler的工作原理,包括Looper.prepare()和Looper.loop()的作用及其在自定义线程中的使用方法。

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

一:首先,一个最简单的发送和回调demo


new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        
        MyHandler myHandler = new MyHandler();
        myHandler.sendEmptyMessage(0);
        
        Looper.loop();
    }
}).start();

从demo看只有简单的三步:  

1.Looper.prepare();//此部分的作用是创建looper,并初始化一个消息队列messageQueue

源码如下:

private static void prepare(boolean quitAllowed) {
    if (sThreadLocal.get() != null) {
        throw new RuntimeException("Only one Looper may be created per thread");
    }
    sThreadLocal.set(new Looper(quitAllowed));
}

private Looper(boolean quitAllowed) {
    mQueue = new MessageQueue(quitAllowed);
    mThread = Thread.currentThread();
}

2.初始化handler ,然后hander.sendMessage();//将消息放入消息队列中


3.Looper.loop();//无限循环的去消息队列中找是否有massage ,如果有回调出来


二.从这三步来分析源码思路


1.


2.

3.


主要的流程完结,最后有个问题,为什么在一般项目中好像没有用到Looper.prepare()和Looper.loop();那是因为我们在UI线程中new Handler,系统在activityThread中帮我们加上了这二句,所以如果你自己创建一个线程,并在这个线程中new Handler(),就要自己加上这二句,否则会报错哦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值