手写代码实现EventBus
来源:互联网 发布:mac java环境变量设置 编辑:程序博客网 时间:2024/05/16 08:50
日志系统做的差不多了,bug不算多也不少,尤其是我的bug,大概有20来个,其他人的bug反而比较少,总结了两点(1)系统之前的bug也提了给我,所以我的bug增加了一倍(2)我负责的模块涉及比较广,很多bug的确是开发时没想到。bug都改完了,剩余了都交给同事了。
今天晚上要去上海出差,下午有点时间写了写其他的代码。上一篇我们介绍了如果利用guava的eventbus完成进程内的事件监听和异步调用。大体看了下源代码并没有深究,感觉还是可以手写一个简单的demo的,这样对eventbus的使用会更加熟悉,首先看一下eventbus中有一些核心的概念和类。
A.Handler 事件处理者(监听器)
当我们异步post数据的时候,我们的目的就是让处理者来处理我们的数据。这个处理者就是handler,也可以称之为监听器。我们需要在运行时动态注册这个处理器,或者在服务启动的时候注册该处理器。
B.@Subscribe注解
被Subscribe注解修饰的方法,其类实例就是事件的处理者。而eventbus如何知道这个关系呢,原因在于当我们注册该事件时,eventbus会根据Subscribe得到被监听的方法的参数,将参数作为key,handler作为value存储在其自身维护的map中。
所以说白了,eventbus就两个核心的方法。第一个是registe,注册。第二个是post,提交。注册的目的是让事件管理器维护好handler与param的关系,post是从map中找到对应的handler处理该事件。处理的方式有两种,第一同步,同步执行会阻塞线程,第二异步,异步不会阻塞线程,因为它的执行是在另外一个子线程中。所以我们设计的时候是基于线程池做的。
(1)首先我们定义一个EventBus的接口:
(2)自定义实现类:
这是我们自己的实现,其构造方法有两个,当什么都不传递的时候默认是同步方式,如果传入了一个线程池对象,则我们认为是异步的。在类中,我们还内置了EventManager这个管理器的实例,用以维护handler与事件的关系。并且由于实现了IEventBus,所以要重写registe方法和post方法:
<1>registe方法
<2>post方法
(3)EventManager事件管理器,管理器在registeListener方法中,通过判断注解SubscribMethod在哪个方法上定义的,从而获取事件参数作为key。
(4)SubscribMethod注解
(5)处理器(监听器)
(6)客户端如何使用:
下面我们就进行一个测试:
(1)同步调用时,发送事件,事件执行2000毫秒,主线程执行5000毫秒,合计约为7000毫秒,因为同步执行会阻塞。
(2)异步调用时,发送事件,事件耗时2000毫秒,主线程执行5000毫秒,合计约为5000毫秒,因为异步执行不会阻塞。
如此,我们就实现了一个简单版的eventbus,当然没有太注重代码的质量,仅仅是依赖线程池封装了一下,不过我想强调的是eventbus的核心思想以及使用方式,如果大家能够明白这些,那使用eventbus就不在话下了。有时间我会仔细研究下其源代码,看看源代码和我们自己的实现到底差别在哪里。
- 手写代码实现EventBus
- 手写代码实现EventBus
- EventBus源码分析,以及手写实现EventBus核心框架
- 手写实现HashMap代码
- 手写EventBus框架
- Ajax手写代码实现-用户验证
- Autolayout手写代码实现动画效果。
- iOS UICollectionView手写代码实现步骤
- cnn实现手写识别字体代码详解
- kNN_手写识别系统代码实现
- web代码手写版 实现功能:单击按钮图片变换
- WCF的简单实例(手写代码实现)--服务端
- WCF的简单实例(手写代码实现)--客户端
- 手把手,74行代码实现手写数字识别
- TensorFlow代码实现(一)[MNIST手写数字识别]
- 用H5+jQuery实现图片轮播的手写代码
- 手写Ajax核心代码
- Ajax手写代码应知应会
- Android中热修复框架AndFix原理解析及案例使用
- picasso使用简要说明
- iframe自适应高度的源代码
- Windows 10快捷键汇总
- Oracle批量执行SQL文件步骤
- 手写代码实现EventBus
- JAVA小结-JVM加载类
- 超级管理员登录后如果连续XX分钟没有操作再次操作需要重新登录
- java 相关查询原理
- java学习笔记--数组和向量、String和StringBuffer
- 几何画板是怎么度量三角形的
- 关于JSON的相关知识
- Unbuntu14.04 安装caffe (cuda7.5)
- json-lib 的maven dependency