浅谈基于反射的EventBus

很尴尬,没有图片,没有代码。

先解释下反射机制:
首先要通过反射获取的对象或者是类是处于运行状态的,然后通过这个Class..forName(),传入完整的类名,获取这个类,用Feild(不知道有没有拼错)去拿属性,用getMethod()方法去拿方法,当然如果是private类型的方法,要用getDxxMethod()方法去取。主要是用来读取Android当中,有些@hide的类,就是一些没有开放的类或者方法,比如系统设置,wifiManger,状态栏管理之类的。

EventBus主要流程:
使用eventBus要先注册,然后在post发送信息,最后activity等要使用它的地方写onEvent的方法。

稍微看了下源码,EventBus实际上是基于Java的反射机制来实现的。因为我们在register的时候会传入当前类的对象。而传这个对象作用是用来遍历这个对象里面的所有的方法,并且先将方法存储在map里面。。判断这个方法里面有没有onEvent()方法,如果有的话,再去比较传入的参数是否一致,如果一致就反射执行这个方法。

那么post是怎么个操作呢,这个就有点像Android的消息机制了。每次post的时候,Eventbus都会将传进来的对象保存在一个队列里面,这里面有个ThreadLocal对象是用来存储线程里面的数据的。这也是EventBus可以切换线程的一个关键。然后,就去比对之前在map里面存储的方法中的参数看是否执行。当然,他也不会去每次都轮训这个队列,每次post的时候都会做一个标记,在轮询的时候都会先判断一下是否有标记,有标记才会继续执行。(怀疑EventBus有时候发送请求没有执行的原因可能就是因为这个原因,当然也可能是因为postSate状态已经取消,或者是添加队列没有添加成功等等,只是猜测,还有待验证)。

整个流程就是这样的,但是中间还有很多判断,很多逻辑上的处理,具体的没有深究,毕竟我不维护它。太过浮躁了,太无聊了,就看看源码,感受一下差距,就能好好学习了。下一篇是RxBus。

    原文作者:badc59a1a8c4
    原文地址: https://www.jianshu.com/p/d7a1bf7e56f0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞