Android源码分析--Handler和Looper机制详解

本文详细解析了Android中的Handler、Looper和Message在消息驱动中的作用。Looper为线程提供消息循环,Handler用于发送和处理消息,Message作为消息载体。通过实例分析了如何创建和使用Handler与Looper,探讨了它们之间的同步问题,并介绍了HandlerThread的使用,以确保在正确的时间创建Handler,避免空指针异常。
摘要由CSDN通过智能技术生成

在Android系统中的应用程序,与Java的应用程序相同,都是靠消息驱动,简单的说就是:有一个消息队列,我们可以不断的向这个消息队列中添加消息,并从中取出消息,处理消息。Android中与此工作相关的主要是由Handler,Looper以及Message来完成。

  • Looper类:为一个线程运行着一个消息循环,内部有一个消息队列,每一个线程只允许最多存在一个Looper;
  • Handler类:允许你向一个线程的消息队列中发送消息,处理消息;
  • Message类:消息类。

使用样例

首先,我们通过一个简单的例子来学习如何使用,Looper和Handler,并通过这个例子来研究一下其工作原理;
1.我们在LooperThread中为消息循环做准备,并创建一个Handler用于处理消息,注意Handler的创建要在调用Looper.prepare()之后;

public class LooperThread extends Thread {
   

    public Handler mHandler;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        Looper.prepare();
        synchronized (this) {
            mHandler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    super.handleMessage(msg);
                    Log.w("LooperThread", "handleMessage::Thread id---" + getId());
                }

            };
        }
        Looper.loop();
        notifyAll();
    }

}

2.接下来我们在主线程中创建一个新的线程,并通过LooperThread中的Handler向LooperThread线程发送消息;

    final LooperThread mLooperThread = new LooperThread();
    mLooperThread.start();
    new Thread() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (mLooperThread.mHandler == null) {
                try {
                    wait();//防止在发送消息时Handler还没建立
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            mLooperThread.mHandler.se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值