Android消息机制使用及详解

概括

用法

Handler

–Handler:用来发送和处理消息,也就是说,在一个线程中发送,在另一个线程中执行,都是由它来完成的。先讲用法,有兴趣的话可以往后看原理。
Handler的创建要求该线程必须具有Looper,如果没有,会报错,主线程默认创建了Looper,再创建,也会报错。要在子线程中创建Handler,需要先创建Looper,即执行:

Looper.prepare();

典型例子:

Looper.prepare();
Handler handler = new Handler();
Looper.loop();

这三句分别就是
1、在当前线程中创建Looper;
2、在当前线程创建Handler;
3、让当前线程循环监听MessageQueue中是否有新事件,这是一个死循环,后面不能在执行代码。

发送消息:

//发送消息
sendMessage(Message msg);
sendMessageDelayed(Message msg,long delayMillis);
sendMessageAtTime(Message msg,long uptimeMillis);

//发送可执行对象
post(Runnable r);
postDelayed();
postAtTime();
postAtFrontOfQueue();

处理消息:
处理Message的话需要重写Handler.dispatchMessage或者Handler.handleMessage()函数。处理Runnable则不需要重写。

Looper.prepare(); //主函数中不需要
Handler handler = new Handler(){
        @Override
        //重写其中之一即可
        public void dispatchMessage(Message msg) {
            //事件先经过此函数,然后分发到handleMessage();
            super.dispatchMessage(msg);
        }

        @Override
        public void handleMessage(Message msg) {
            //可以根据msg.what判断要进行什么操作
            //比如
            switch(msg.what){
                case 1: break;
                case 2: break;
            }
            super.handleMessage(msg);
        }
    };
    Looper.loop(); //主函数中不需要

MessageQueue

用来存储Message,主要包含两个操作,插入和读取(伴随着删除),分别为enqueueMessage和next。因此使用单链表来实现,链表插入和删除当然比较有优势啦。我们在代码中不需要操作,后面详解

Looper

Looper:不停地查看MessageQueue中是否有新消息,
使用过程中重要的两个方法:
1、Looper.prepare(); 该方法在当前线程中创建一个Looper,Looper创建过程中会创建MessageQueue;
2、Looper.loop(); 该方法使线程进入死循环,等待新消息到来;

ThreadLocal

并不是必须的,但有一些巧妙的作用,ThreadLocal是一个线程内部的数据存储类,每个线程获取到的数据都是自己独有的副本,直接栗子说明,后面详解:

private final ThreadLocal<Boolean> mBooleanThreadLocal = new ThreadLocal<>();
        mBooleanThreadLocal.set(true);
        Log.d(TAG, "Thread#main==>mBooleanThreadLocal=" + mBooleanThreadLocal.get());

        new Thread(){
            @Override
            public void run() {
                mBooleanThreadLocal.set(false);
                Log.d(TAG, "Thread#1==>mBooleanThreadLocal=" + mBooleanThreadLocal.get());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                Log.d(TAG, "Thread#2==>mBooleanThreadLocal=" + mBooleanThreadLocal.get());
            }
        }.start();

三个线程中打印的Log分别为:true,false,null;原理后面分析;

用法示例

源码解析

handler

MessageQueue

Looper

ThreadLocal

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值