浅谈Handler消息机制并手撸一套Handler

前言

Handler是用于Android接收、传递、处理消息的处理类,结合Message、MessageQueue、Looper实现一个消息循环机制。

子线程向UI线程传递消息

创建Handler

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Log.i(TAG, Thread.currentThread().getName() + "收到消息:" + msg.obj);
        }
    };

由子线程发送消息

    public void sendMessage(View view) {
        Thread mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = mHandler.obtainMessage();
                message.obj = Thread.currentThread().getName() + "发送消息";
                mHandler.sendMessage(message);
            }
        });
        mThread.setName("子线程");
        mThread.start();
    }

打印结果

简要说明

  • 我们一般会在UI线程创建一个Handler,重写Handler的handleMessage(Message msg)方法,此方法返回的Message就是其他线程传递来的消息对象。
  • 在子线程中通过Handler的obtainMessage()方法获取一个Message对象。通过Message.what标记信息int值方便接受消息的时候判断信息来源;通过Message.obj传递携带数据。
  • 通过Handler的sendMessage()将消息发送;

子线程之间传递消息

创建Handler(在子线程中创建)

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();  //  1
                mHandler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        Log.i(TAG, Thread.currentThread().getName() + ": 收到" + msg.obj);
                    }
                };
                Looper.loop();   //  2
            }
        });
        mThread.setName("线程1");
        mThread.start();
    }

发送消息(同样在子线程中)

      public void sendMessage(View view) {
        Thread mThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = mHandler.obtainMessage();
                message.obj = Thread.currentThread().getName() + "发送的消息";
                mHandler.sendMessage(message);
            }
        });
        mThread.setName("线程2");
        mThread.start();
    }

打印结果

简要说明

  • 这里就要注意一下代码1、和代码2处了,为什么在开启子线程创建Handler需要做这两个操作,带着疑问,进入我们今天的主题。

源码解析

创建Handler

创建Handler最终会调用Handler的构造方法

    public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值