EventBus

基于EventBus API 3.2.0

发布/订阅事件总线框架,基于观察者模式;

四种线程模式:

ThreadMode.POSTING:发送和接收事件在同一线程处理。

ThreadMode.MAIN:发送不管在哪个线程,接受处理都在主线程。

ThreadMode.BACKGROUND:发送不管在哪个线程,接受处理都在子线程。如果在子线程发送事件,则直接在发送事件的线程处理事件。

ThreadMode.ASYNC:不管在哪个线程发送事件,都将开启新的线程处理。

EventBut 内部使用的 map:

1.  Map<Class<?>, List<SubscriberMethod>> METHOD_CACHE:

Class<?>:当前添加 rigister(this) 的类;List<SubscriberMethod> 这个类里面使用Subscribe注解的方法的集合。

SubscriberMethod里面的属性:Method对象、线程模式、事件类型(注解方法中的参数类型)、优先级、是否是粘性事等。

2.  Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType:

Class<?>:事件类型,CopyOnWriteArrayList<Subscription>:同一事件类型的集合。

Subscription里面的属性:所属的实例化对象 和 SubscriberMethod

3.  Map<Object, List<Class<?>>> typesBySubscriber:

Object : 当前添加 rigister(this) 类的实例化对象, List<Class<?>>:这个实例化对象中所有事件类型的集合;

调用EventBus.getDefault().register(this); 注册时 会通过 反射获取当前类里所有Subscribe注解的方法,并获取每个方法的 method, eventType, threadMode, priority, sticky属性封装成一个SubscriberMethod对象,添加到集合里面,再遍历这个集合按照方法的属性分类分别添加到上面三个map里面。详见EventBus类register(Object subscriber)方法,141行。

当发送事件时:

a

会通过subscriptionsByEventType 获取对应的list遍历去执行里面的方法。

b

mainThreadPoster是一个获取主线程Looper的Handler的子类 HandlerPoster,就是通过这个handler发送消息到主线程来实现线程切换的。

BackgroundPoster和AsyncPoster都是实现了Runnable接口的类,内部的enqueue方法都是把自己加入EventBus类里面的缓存线程池里,而他们实现Runnable接口的run方法都是调用EventBus的invokeSubscriber()方法。

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

推荐阅读更多精彩内容

  • github源码分享:https://github.com/greenrobot/EventBus 官方图解: E...
    MR_特殊人士阅读 811评论 0 3
  • 前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 不知不...
    hpc阅读 645评论 0 0
  • EventBus源码阅读 一、几个简单类 1. Subscribe注解 对于该注解没啥好说的: 三个属性的作用: ...
    慕北人阅读 218评论 0 3
  • EventBus大家一定不陌生,组件之间传递消息只要post一下,对方就能收到,还可以任意切换线程,究竟内部是如何...
    99123阅读 1,612评论 0 1
  • EventBus作用 事件总线用于观察者模式,用于通知使用,需要注册,和解注册,订阅要执行的方法,然后post发送...
    杨殿生阅读 1,410评论 0 0