EventBus事件总线框架(发布者/订阅者模式,观察者模式)
一、 android应用内消息传递的方式:
1. handler方式-----------------不同线程间传递消息。
2. Interface接口回调方式-------任意两个对象。
3. Intent进行组件间通信,广播方式。
二、单例比较好的写法:
private static volatile EventBus defaultInstance;
构造函数应当是private,不应该是public
1 public static EventBus getDefault() { 2 if (defaultInstance == null) { 3 synchronized (EventBus.class) { 4 if (defaultInstance == null) { 5 defaultInstance = new EventBus(); 6 } 7 } 8 } 9 return defaultInstance; 10 }
双重检查锁(DCL)的方式,防止并发的问题,还能极大的提高效率。
三、EventBus3.0以前
1. 采用发布者/订阅者模式(观察者模式)设计的简化Activity、Fragment、Service、threads等之间通信的一种事件框架机制,
让代码简洁,耦合性更低。
2. 主要核心内容:注册(事件订阅)方法、事件发布方法、反注册(取消订阅)方法。
3. EventBus通过DCL单例获取一个实例 EventBus.getDefault();
EventBus一共提供了4种线程模型ThreadModel,分别是PostThread, MainThread, BackgroundThread, Async。
PostThread --------------默认实现,执行发生在发布事件的同一个线程;
MainThread --------------执行在UI主线程上;
BackgroundThread、Async---两个都是通过Executors.newCachedThreadPool()线程池来执行的。
Event事件,任意类型对象;
subsciber 事件订阅者,
publisher 事件发布者,EnentBus.post(Object)
EnventBus.getDefault()
EnventBus.getDefault().register()
EnventBus.getDefault().unregister()
EnventBus.getDefault().post(Object)
四、 EventBus3.0版本引入了注解来订阅处理函数
可以通过运行时注解+反射来获取订阅回调函数
也可以通过编译时@Subscribe注解生成class文件,编译时生成MyEventBusIndex类,该类中包含了List<SubscriberMethod>内容。