自定义简易EventBus

本章通过自定义一个简易的EventBus来了解EventBus的框架思路;

EventBus的设计思路是通过向内存中注册订阅者对象和订阅者方法并且将他们缓存起来,在Post的时候在缓存中查找,如果命中则通过反射机制调用订阅方法达到通知的目的;

通过 自定义以下几个步骤,一共4个类来了解实际的过程

初始化:

注册:

解绑:

Post:

反射类:


只定义1个主线程,1个后台线程;

注解类:


注解类省掉别的参数,只定义1个线程模式;


封装1个订阅方法类:


MyEventBus 主类

初始化:


双重锁检查生成单例模式的EventBus对象


注册流程:


注册的逻辑:

1:通过订阅者对象向缓存查询是否命中,命中返回

2:通过反射查找到订阅者的全部订阅方法,并且缓存起来

3:查询完本类继续 查询父类


1:反射查找全部方法

2:剔除非public 和static的方法

3:获取参数,仅当参数为1个的情况下继续

4:获取注解,根据注解的参数来封装1个订阅者方法(MySubScribeMehod)

5:订阅者对象和订阅者方法映射缓存在内存中


解绑过程:


通过订阅者查询内存中的订阅者方法列表,命中则移除;


Post流程:


遍历缓存列表,通过Post的事件去查询,如果命中了,则将命中的方法反射调用达到通知的目的;

注:isAssignableFrom 方法是对比2和类的类信息,继承关系也可命中;

反射调用的时候涉及到线程调度,接着看是如何进行线程的调度的;

先封装1个反射的方法




一   接收者要求在Main主线程

        1:如果Post发布者是在主线程,直接反射调用

        2:如果Post发布者是在子线程,通过Handler调用,我们只需要在初始化的时定义1   个Handler就好

二 接收者要求在子线程

         1:如果Post发布者是在主线程,通过定义1个线程池,new1个线程来异步调用

         2:如果Post发布者是在子线程,则直接反射调用即可

测试结果:




说明:本篇只是学习EventBus框架学习定义的1个简单的EventBus,每个流程都简单处理了,具体学习还要看EventBus源码;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • EventBus用法及源码解析目录介绍1.EventBus简介1.1 EventBus的三要素1.2 EventB...
    杨充211阅读 5,915评论 0 4
  • 前面对EventBus 的简单实用写了一篇,相信大家都会使用,如果使用的还不熟,或者不够6,可以花2分钟瞄一眼:h...
    gogoingmonkey阅读 2,481评论 0 0
  • 我每周会写一篇源代码分析的文章,以后也可能会有其他主题.如果你喜欢我写的文章的话,欢迎关注我的新浪微博@达达达达s...
    SkyKai阅读 25,073评论 23 184
  • 观察者模式 自己对观察者模式的理解:定义:Define a one-to-many dependency betw...
    安仔夏天勤奋阅读 4,951评论 1 3
  • 大家好我是和和,和和是让您创造额外持续收益的新天地,和和是会员制共享人人参与持股的大众化公司;公司收益的31%归投...
    和和会员阅读 975评论 0 0