Hander与HanderThread,Looper以及MessageQueue和Message之间的关系.
Hander与HanderThread,Looper以及MessageQueue和Message之间的关系.
以上这几个东西的目的是设计来解决位于主线程中的某些操作比较耗时(比如httpclient请求),影响界面响应,而导
致主程序无法处理其他监听事件。致使程序卡死的问题。(界面提示,无响应关闭)
1:Handler对象 中有两个属性,一个是来自于当前线程(或者拥有Looper对象的线程)的threadlocal变量中的Looper
对象和该looper对象中的messagequeue属性。
有这两个属性的目的主要是往当前线程的looper对象的messagequeue队列中加入message对象。
2:Message对象,也有两个重要的属性,一个是Hander对象,这个handler对象就是把该message加入队列的那
个handler对象,另一个对象就是bundle对象,这个对象的目的就是用来存储数据,相当于一个hashmap对象。
3:Looper对象,有一个重要的属性就是MessageQueue对象,Looper的loop方法,会不断的从该队列中读取message对
象,并调用messgae对象中的Hander属性对象的dispatherMessage(msg)方法,该方法,就是会调
用handler的handleMessage方法,(也就是我们重写的那个方法)。
4:MessageQueue对象,管理message的队列对象,它有一个属性就是Message对象,MessageQueue中始终只有一
个message对象,因为message对象是一个链式结构的对象,它的prv和next属性记录了他之前和之后的message对象,所
以,我们调用MessageQueue的next方法就能回的需要的message对象。
从hander与Looper以及MessageQueue和Message的关系中我们可以看出来,执行流程如下:
1:有人创建hander对象,并取得对应的Looper对象赋给该hander,通过Hander的sendmessage或post方法将handler
包装到message对象中, 再将该message对象加入到消息队列中。(消息队列就是Looper对象中消息队列属性)
2:线程(管理Looper对象的线程)不断的调用Looper对象中的loop方法,loop方法又从messageQueue队列中获
取Message对象,然后调用该对象里的hander属性对象的dispatherMessage(msg)方法,从而,依次执行我们加入
的handler任务。
这就是hander的处理流程。那么HandlerThread是做什么的,他是一个管理Looper对象的线程类。我们的Looper一般来自
于两个地方,一个地方就是主线程的Looper对象,另一个就是我们另外开启一个线程来创建和管理Looper对
象。android提供已经给我们提供了一种这样的一个类,那就是HandlerThread对象。