志在指尖
用双手敲打未来

消息驱动Looper和Handler类分析

Android体系中的音讯驱动作业原理:
1、有一个音讯行列,能够往这个音讯行列中投递音讯;
2、有一个音讯循环,不断的从音讯行列中取得音讯,然后处理。
作业流程:
1、事件源将待处理的音讯加入到音讯行列中,一般是加至行列尾部(优先级高的音讯能够加至行列头),事件源提交的音讯能够是按键、触摸等物理事件产生的音讯,也能够是体系或应用程序发出的音讯;
2、处理线程不断的从音讯行列头中取出音讯并处理。
在Android体系中,这些作业主要由Looper和Handler完成:
Looper类,用于封装音讯循环,并且有一个音讯行列;
Handler类,封装音讯投递、音讯处理等接口。
一、Looper类剖析
Looper用于封装了android线程中的音讯循环,默认状况下一个线程是不存在音讯循环(messageloop)的,需求调用Looper.prepare()来给线程创立一个音讯循环,调用Looper.loop()来使音讯循环起作用,运用Looper.prepare()和Looper.loop()创立了音讯行列就能够让音讯处理在该线程中完结。
classLooperThreadextendsThread
{publicvoidrun()
{
Looper.prepare();//代码1….Looper.loop();//代码2….}
}
(1)在Looper.prepare()中,界说一个ThreadLocal目标sT,并构造一个Looper目标设置到调用线程的局部变量sT中。
ThreadLocal是java中的线程局部变量类(ThreadLocalVariable),该类有两个关键函数:
set:设置调用线程的局部变量
get:获取调用线程的局部变量
因而,prepareh函数会在调用线程的局部变量中设置一个Looper目标。这个调用线程便是LooperThread的run线程。
privateLooper(){//构造一个音讯行列mQueue=newMessageQueue();//得到当时线程的Thread目标mThread=Thread.currentThread();
}
prepare函数中设置了一个Looper目标,目标保存在这个调用线程的局部变量中。而Looper目标内部封装了一个音讯行列。
(2)Looper循环
>在Loop()办法中,首要经过ThreadLocal的get办法获取创立的Looper目标;
>之后取出这个Looper的音讯行列MessageQueuequeue=looper.mQueue;
>while循环中,处理音讯:
while(true){
Messagemsg=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。android
二、Handler类剖析
Handler中包含的成员:
Hadler.java:
finalmessageQueuemQueue;//Handler中也有一个音讯行列finalLoopermLooper;
finalCallbackmCallback;//i回调用的类
在Handler的构造函数中,Handler中的音讯行列终究会指向Looper的音讯行列。
(1)刺进音讯到Looper音讯行列
Handler提供了一系列协助完结创立音讯和刺进音讯行列的函数。
例如Handler.java中sendMessage发送一个音讯,将音讯添加到音讯行列结尾:
publicfinalbooleansendMessage(Messagemsg){returnsendMessageDelayed(msg,0);
}publicfinalbooleansenMessageDelayed(Messagemsg,longdelayMilis){
……returnsenMessage(msg,SystemClock.uptimeMillis()+delayMillis);//当时时间}publicbooleansendMessageTime(Messagemsg,longuptimeMillis){
booleansent=false;
MessageQueuequeue=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来处理。

未经允许不得转载:IT技术网站 » 消息驱动Looper和Handler类分析
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载