android消息驱动,「Android」消息驱动Looper和Handler类分析

Android系统中的消息驱动工作原理:

1、有一个消息队列,可以往这个消息队列中投递消息;

2、有一个消息循环,不断的从消息队列中取得消息,然后处理。

工作流程:

1、事件源将待处理的消息加入到消息队列中,一般是加至队列尾部(优先级高的消息可以加至队列头),事件源提交的消息可以是按键、触摸等物理事件产生的消息,也可以是系统或应用程序发出的消息;

2、处理线程不断的从消息队列头中取出消息并处理。

在Android系统中,这些工作主要由Looper和Handler实现:

Looper类,用于封装消息循环,并且有一个消息队列;

Handler类,封装消息投递、消息处理等接口。

一、Looper类分析

Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。

classLooperThread extends Thread

{public voidrun()

{

Looper.prepare();//代码1....

Looper.loop();//代码2....

}

}

(1)在 Looper.prepare()中,定义一个ThreadLocal对象sT,并构造一个Looper对象设置到调用线程的局部变量sT中。

ThreadLocal是java中的线程局部变量类(Thread Local Variable),该类有两个关键函数:

set:设置调用线程的局部变量

get:获取调用线程的局部变量

因此,prepareh函数会在调用线程的局部变量中设置一个Looper对象。这个调用线程就是LooperThread的run线程。

privateLooper(){//构造一个消息队列

mQueue = newMessageQueue();//得到当前线程的Thread对象

mThread =Thread.currentThread();

}

prepare函数中设置了一个Looper对象,对象保存在这个调用线程的局部变量中。而Looper 对象内部封装了一个消息队列。

(2)Looper循环

> 在Loop()方法中,首先通过ThreadLocal的get方法获取创建的Looper对象;

> 之后取出这个Looper的消息队列  MessageQueue   queue = looper.mQueue;

> while循环中,处理消息:

while(true){

Message msg=queue.next();//处理i消息,Message对象中有一个target(Handler类型)//如果target为空,则退出消息循环

if (msg != null) {if (msg.target == null) { return; }//调用该消息的Handler,交给他的dispatchMessage函数处理。

msg.target.dispatchMessage(msg);

msg.recyle();

}

}

因此,分析prepare和loop函数后,Looper的作用有:

1、封装了一个消息队列;

2、prepare函数把这个Looper和调用prepare的线程(最终的处理线程)关联在i一起;

3、处理线程调用loop函数,处理来自消息队列的消息

当事件源向Looper发送消息时,消息加到Looper的消息队列。该消息将由和Looper绑定的处理线程来处理。

注:Looper、Message、Handler的关系:

1、Looper中有一个Message队列,存储的时一个个待处理的message;

2、Message中有一个Handler,用来处理Message。

二、Handler类分析

Handler中包括的成员:

Hadler.java:

final messageQueue mQueue; //Handler中也有一个消息队列

final Looper mLooper;

final Callback mCallback;//i回调用的类

在Handler的构造函数中,Handler中的消息队列最终会指向Looper的消息队列。

(1)插入消息到Looper消息队列

Handler提供了一系列帮助完成创建消息和插入消息队列的函数。

例如Handler.java中sendMessage发送一个消息,将消息添加到消息队列末尾:

publicfinal boolean sendMessage(Message msg) {return sendMessageDelayed(msg, 0);

}public final boolean senMessageDelayed(Message msg, longdelayMilis){

......return senMessage(msg, SystemClock.uptimeMillis() + delayMillis); //当前时间

}public boolean sendMessageTime(Message msg, longuptimeMillis) {

boolean sent= false;

MessageQueue queue=mQueue;if (queue != null) {

msg.target= this; //将targt设置为自己,然后加入到消息队列

sent =queue.enqueueMessage(msg, uptimeMillis);

}returnsentl

}

(2)Handler的消息处理

在loop方法中,如果获得消息后会调用target的dispatchMessage函数,然后将这个消息派发给Handler处理。

dispatchMessage定义了一套消息处理的优先级机制:

> Messagu如果自带callback处理,则交给callback处理;

> Handler如果设置了全局的mCallback,则交给mCallback处理;

> 如果上述都没有,消息则会被交给Handler子类实现的handleMessage 来处理。(这需要从Handler派生并重载handleMessage函数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值