Handler

作者: 霍霍9527 | 来源:发表于2019-12-13 17:37 被阅读0次

Handler

Handler用来处理消息
Handler的三种处理消息方式的原理

成员:

    final Looper mLooper;
    final MessageQueue mQueue;
    final Callback mCallback;
    final boolean mAsynchronous;
    IMessenger mMessenger;

构造方法:

1,初始化自己的Callback callback
2,初始化异步消息状态mAsynchronous
3,初始化Looper,子线程需要的时候才创建传递looper
4,初始化messageQueue,通过Looper获取mQueue

消息创建

obtainMessage获取消息本质调用Message.obtain()(享元设计模式)

消息发送

postXXXX()
sendXXXXMessage()
handler将消息放入到MessageQueue

消息消费分发

dispatchMessage方法:面向对象封装原则分发消息
message消费顺序,Message自己callback->Handler自己callback->Handler#handleMessage
1,Message#callback:Handler#postXXX(Runnable)方法,给message设置callback
2,Handler#callback: Handler创建对象传入
3,Handler#handleMessage:默认实现,子类要实现该方法处理message

执行流程
Handler-->Looper-->MessageQueue-->message

Looper

1、在线程内创建Looper#prepare方法创建线程
初始化MessageQueue
记录当前线程Thread
2、执行轮训Looper#loop --->循环取消息MessageQueue#next
Message==null(Looper#quitSafely)退出,否则会阻塞
Message!=null派发消息Message#target#dispatchMessage(Message);
Message#recycleUnchecked释放消息将消息放入链表池
3、线程执行结束退出Looper#quitSafely执行MessageQueue#quit

MessageQueue

存储有时间顺序的Message链表
封装native方法与native通信传递消息

主要成员

Message mMessages;//当前第一个执行的Message,也是时间顺序链表头

存储消息

MessageQueue#enqueueMessage 存储在时间顺序的Message链表

取消息

MessageQueue#next

  • 如果有消息
    • <= 当前时间,打断链表,取出消息
    • > 当前时间,未来消息,计算时间差值并延时阻塞等待
  • 如果没有消息
    阻塞等待

Message消息

实现了Parcelable接口

内部核心成员

    /*package*/ long when;//消息时间戳
    /*package*/ Bundle data;//数据
    /*package*/ Handler target;//发送消息的Handler,基本不等于null
    /*package*/ Runnable callback;//消息的自己处理回调
    /*package*/ Message next;//链表下一位
    public static final Object sPoolSync = new Object();//同步
    private static Message sPool;//链表池子
    private static int sPoolSize = 0;//链表池子个数
    private static final int MAX_POOL_SIZE = 50;//最大长度

获取消息

Message#obtainXXX

存入链表池子

Looper#loop -> Message#target#dispatchMessage(Message) ->Message#recycleUnchecked

相关文章

网友评论

      本文标题:Handler

      本文链接:https://www.haomeiwen.com/subject/uhqfnctx.html