Android_handler源码分析,及介绍

来源:互联网 发布:芜湖 网络推广专员 编辑:程序博客网 时间:2024/05/17 09:44

解决了  线程间通讯问题   (三种通讯方式, handler在哪个线程创建)

    1.Handler: 推送消息到Message Queue里;或者接收Looper从Message Queue取出,所送来的消息。

    2. Message Queue(消息队列):用来存放线程放入的消息。

    3.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。

    介绍handler机制流程

    一个线程只能对应一个looper和messageQueue  可以有多个handler(Google不建议我们使用多个,容易造成 内存泄漏)

    handler可以在不同线程中创建,但是子线程的handler发送的消息,主线程不能接收到. 因为如上;

    源码:     

1.handler不同参数的构造都只调用了一个构造

       首先调用Looper.myLooper()获取当前线程的looper,获取获取消息队列  如果当前线程不存在会报让你调用Looper.perpare()异常

       application源码   中默认调用了如上方法 application的onCreate的方法在主线程中              

2.obtainMessage(三种创建msg):  创建Message  都是调用Message.obtain()方法,首先在消息池在中取消息,如果没有就创建一个消息. message内部都保存了对handler的引用,Looper根据引用知道是哪个handler发送的消息,然后分发消息执行回调(两种回调)

    首先从消息池中获取消息 返回当前消息  指向下一个消息  单链表的下一个消息置为空

    最大消息池10个

    清理消息:将消息对象的所有属性置为空后  指向单链表的下一个消息

     本身就是单链表 对消息完成复用(回收消息:清空消息的属性)

3.sendMessage:  (不同参数)都调用的是sendMessageDelayed()  然后调用

    (发消息最终是由)sendMessageAtTime()

    也调用又调用了enqueueMessage()存放消息,并且按消息的时间排序

    获取到消息唤醒消息队列  

4.post:--->走的是sendMessage,给message添加了callback的标记(存放的是runabler任务)runabler是在主线程中执行的.

5.removeMessages: 移除等待执行的message  因为Looper一次只能执行一个message

6.removeCallbacks: 执行的是如上方法  移除等待执行的message只是传了一个runnabler根据这个找到对应message

7.dispatchMessage:Looper拿到message的实例后调用,是在主线程中调用的

runOnUIThread:判断是不是在主线程,在主线程就直接调用run方法,不再就handler.post 

1 0
原创粉丝点击