Handler原理讲解

这篇博客详细解析了Android中Handler的工作原理,包括Handler、Looper、MessageQueue之间的关系,以及如何在线程间切换处理消息。文中强调主线程的Looper在ActivityThread的main()方法中创建,并通过prepareMainLooper启动消息轮询。Handler的创建方式不同会影响消息的处理路径,如post()实际上是通过Runnable回调处理,而sendMessage()则调用handleMessage()。此外,还探讨了如何在子线程中创建自己的Looper来处理消息。
摘要由CSDN通过智能技术生成

Handler原理讲解

主要是讲解(记录)此前看到的Handle如何做线程切换原理

Handler涉及类

Handler、线程、Looper、MessageQueue关系

  1. 一个线程只有一个Looper和一个MessageQueue

  2. 子线程创建Handler对象时需要传入Looper,如果是将消息发送到主线程的话

  3. 每个Handler都会关联一个消息队列,消息队列被封装在Looper中,而每个Looper又会关联一个线程(Looper通过ThreadLocal封装)。最终就等于每个消息队列都会关联一个线程

Looper是轮询器,不断轮询MessageQueue,取出Message,如果有Message,就取出,并交予Handler处理。需要注意的是线程与Looper和MessageQueue是一一对应的

解析

Handler创建

平时使用Handler大概是这样:

//在主线程中创建Handler并使用
Handler handler = new Handler();
handler.post(new Runnable() {
   
    @Override
    public void run() {
   
        loadData();
    }
});

//在子线程创建Handler并使用
Handler handler = new Handler();
handler.post(new Runnable(getMainLooper()) {
   
    @Override
    public void run() {
   
        loadData();
    }
});

如上所示,(都是将消息发送到主线程中处理)如果在子线程中创建Handler,比在子线程中创建Handler不一样的是仅仅在创建Handler对象时使用的构造器不一样:在子线程中传入了Looper对象(来自getMainLooper())。查看Handler构造器:

public Handler() {
   
    this(null, false);
}

public Handler(Callback callback, boolean async) {
   
    if (FIND_POTENTIAL_LEAKS) {
   
        FIND_POTENTIAL_LEAKS一直都会是false,不需要关心该控制语句
       ...省略
    }

    mLooper = Looper.myLooper();
    if (mLooper == null) {
   
        throw new RuntimeException(
            "Can't create handler inside thread that has not called Looper.prepare()");
    }
    mQueue = mLooper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
}

public Handler(Looper looper) {
   
    this(looper, null, false);
}

public Handler(Looper looper, Callback callback, boolean async) {
   
    mLooper = looper;
    mQueue = looper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值