Android第十一天 Handler

Handler   


一、引入Handler   消息传递机制 
      1、案例:  网络访问结果直接显示到UI页面中  
            结论:  出现异常问题 
 CalledFromWrongThreadException 
                  Message
        分析:  引入UI线程与工作线程 MainThread 与WorkThread 
                    主线程不能访问网络, 子线程不能更新UI 
      2、Handler的基本使用
A、流程 
   1.定义Handler类 
   2.重写handleMessage方法 
        3.使用Message包装对象 
   4.handler send Message 
   5.handleMessage方法接收并处理 
B、细节 
    1.Message 获取三种方式  
new Message —  
Message.Obtain(); — 在消息池中获取空消息使用,节省资源    
handler.ObtainMessage();--  与上面的一 
    2.Message 的方法
arg1  用来存放int型数据 
arg2  用来存放int型数据 
object  用来存放Object对象 
what    用来标记,用户自定义标记 根据消息代码不同而执行不同的响应操作 
 需要注意的地方
1.构造  使用节省资源的方式 
2.int型数据优先使用arg 节省资源 
3.使用MessageWhat标记 
4.将大数据集合为Bundle对象 传递 
   3.handler的发送方式
      1. handler .sendEmptyMessage(what )

       2.handler.sendEmptyMessageAtTime()

       3.handler.sendEmptyMessageDelayed()    

       4.handler.sendMessage();

       5.handler.sendMessageAtTime();

       6.handler.sendMessageDelayed();

  4.接收 handleMessage

  
二、原理分析 
 
1.介绍四个类所有的方法 

 Handler
属性:MessageQueue -- handler讲消息发送出去实际就是放在这里 
           Looper--每个handler有一个looper为其不断的接受消息队列消息 
   CallBack--回调接收 方法handleMessage 
方法: 
handleMessage : 回调接口中的方法 
obtainMessage:获取消息实例  本质还是调用Message.Obtain 
sendMessage: 
sendMessageDelayed: 
sendMessageAtTime: 
sendEmptyMessage: 
sendEmptyMessageDelayed: 
sendEmptyMessageAtTime:y
post: 
postDelayed: 
postAiTime: 
enqueueMessage:将消息压入到MessageQueue中 
dispatchMessage:当looper不断的获取到消息后调用该方法分发消息触发CallBack里的handleMessage方法进行消息处理 

 Looper
    属性: 
ThreadLocal<Looper>:  本地线程变量 由于该变量保证每个线程只有一个Looper也就是说一个线程只能有一个Looper 
方法: 
prepare:所有的Handler 所在线程都必须有一个looper 准备好 
prepareMainLooper:获取主线程中的looper对象 
myLooper:从线程本地变量中获取当前线程的Looper对象 
loop:循环接收消息队列中的消息 

 Message
属性: 
what: 标记消息 
arg1: 存放消息的 int 
arg2: 存放消息的 int 
obj: 用来存放消息的Object 
data:用来存放消息属性Bundle 
target:标示  Handler 
sPool:消息池中的每个消息对象 
sPoolSize:纪录消息池中剩余消息的数量 
MAX_POOL_SIZE:消息池中的最大消息对象数量 
replyTo: Messenger:自定义信使对象  跨进程 

方法: 
obtain:      获取Message实例 
setTarget: 设置收到消息的Handler 
getTarget: 获取应该收到消息的Handler 
setData:   设置Bunldle对象 
getData:   设置Bunldle对象 
sendToTarget: 将消息发送到目标Handler对象,本质还是调用sendMessage 
recycle:     往消息池中归还消息对象 

 MessageQueue
属性: 
enqueueMessage:通过改方法将消息添加到自己的队列中 
next:下一个Message   

3.源码分析 
图片:
Android第十一天 Handler