注意:
1,post()方法里面的类型和onEvent()中的类型要一致。,
2,订阅者对象中 必须有 onEvent 的 public 方法 ---public void onEvent(Object event) { //接收消息 }
3, EventBus是一款针对Android优化的发布/订阅事件总线。
主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
在Activity中的onCreate和onDestroy里分别注册和解除注册,并且声明public void onEvent(FirstEvent event) { } 等几个函数就可以了。
要说明的是EventBus是一个进程范围内的发布/订阅时间总线,所以只能在一个进程内进行订阅和发布,如果你在新的进程里给Service/Activity发送消息,就无法收到消息了。
本质上来说,EventBus是一个在进程内给不同的类发送消息的事件总线,不论是Activity或是Service都可以。
5,FirstActivity , 注册eventBus, onEvent()方法, SecondAct发送消息: 点击按钮从FirstAct跳到 SecondAct。
可以在 解决-----在前一个Activity注册的时候,把目标的Activity实例化注册,就可以传参数了.或
在发送EventBus post请求之前 ,在发送Activity实例化目标Activity (这样:EventBus.getDefault().register(new 目标Activity());)
或者 重写一个MainApplication里面(EventBus.getDefault().register(new 目标Activity());)。这样就可以啦。
- eventbus是必须先订阅,才能传值的,你新activity还没有生成,也就还没有订阅成功,你就post值,肯定是接收不到的。
- 先post的,再rigister的,肯定没有获取不到数据。
- EventBus要先生产(注册)才能消费(订阅),新的activity没有注册监听,它怎么能收到订阅
- 有一个叫delayXXX的方法可以
3,--EventBus 与otto的区别
3,--EventBus 与 Activity,BraodCast,Service之间传递数据?
2,-- Event Bus基本用法
分订阅、注册、发布、取消订阅;主体都是谁?
注册:EventBus提供了三个构造方法
EventBus.getDefault().register(this);
EventBus.getDefault().register(new MyClass());
//三个参数分别为:消息订阅者(接收者),接收方法名,事件类(里面可以定义要传递的属性)
EventBus.getDefault().register(this, ”setTextA”, TextA.CLASS);
取消注册: 一般都是在ondestory()方法里面进行取消注册,释放资源!取消注册,只需要传递消息订阅者就可以了。
EventBus.getDefault().unregister(this);
EventBus.getDefault().unregister(new MyClass());
EventBus订阅处理数据:
EventBus支持四种模式,--主线程的数据处理,交互式线程,后台线程和异步线程。
onEventMainThread(), onEvent(), onEventBackgroundThread()。
发布:支持直接发布以及 支持 发布滞留消息:
EventBus.getDefault().post(对象);
postStickyEvent();
观察者模式::
按钮触发监听事件—->EventBus发送消息—->EventBus接收消息—->处理接收到的消息。
安卓平台上一个用于Activity,Fragment,Thread,Service被优化简化的通讯协议。少代码,高质量
它自定义事件类的功能特别强大, 有了这样定制消息的功能,我们就可以个性化消息,来对消息进行分类。
在EventBus中的观察者通常有四种订阅函数(就是某件事情发生被调用的方法)
1、onEvent()
2、onEventMainThread()
3、onEventBackground()
4、onEventAsync()
该方法将会在同一个线程来调用,避免了线程之间的切换,比如你是在主线程发送的消息,那么将会运行在主线程,如果为其他线程,那么将在其他线程调用。
// 在相同线程里调用(默认):在onEvent方法中不能执行耗时的操作,如果执行,则导致事件分发延迟。
public void onEvent(MessageEvent event) {
log(event.message);
}
// 在主线程(UI线程)调用--不论发送事件者在那个线程,接受事件都 将会在主线程调用,
public void onEventMainThread(MessageEvent event) {
textField.setText(event.message); //进行UI操作
}
// 接收者直接在后台线程
如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
public void onEventBackgroundThread(MessageEvent event){
saveToDisk(event.message); //进行耗时操作
}
onEventAsync();---使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
1.1 --Event Bus 和 Otto事件总线分发库
什么是事件总线管理?
1)将事件放到队列里,通过队列进行事件的管理和分发!
2)保证应用的各个部分之间高效的通讯及数据、事件分发!
3)模块之间的解耦! 不用写网络请求接口回调了,直接通过EventBus传递数据。(通过接口回调传递数据、通过EventBus传递数据)
Event Bus是一个发布/订阅的事件总线。
Event Bus模式也被称之为Message Bus或者 发布者/订阅者模式,可以让两个组件相互通信,但是它们之间并不相互知晓。有些类似于(广播机制)。
1)在需要接收信息的地方,进行一个订阅和注册;
2)在发送数据的地方进行发布
3)然后在订阅的地方就可以收到,并进行处理。
基于事件总线管理/订阅/分发模式。事件响应有更多线程选择,EventBus可以向不同的线程中发布事件。
使用时需要先注册订阅,发布者然后向订阅者分发消息数据即可。
订阅者可以订阅多个事件,发布者可以发布任何事件;发布者同时也可以是订阅者。分订阅、注册、发布、取消注册等步骤。
Event Bus包含四个部分:发布者、订阅者、事件、总线。
Event Bus分发流程:
1)发布者首先把它的事件传递到Event Bus事件总线里面进行管理,等待分发;
2)事件总线按照相应的逻辑,把事件发布给定阅者;
3)然后订阅者就可以接收到数据(通过对应的方法进行接收),进行相应的处理。
Event Bus基于标准的命名规范,注解模式比较消耗内存,所以Event Bus效率上要高一些。
Event Bus支持交互线程的事件传递(支持主线程和子线程的通讯)Event Bus传递效率比较快。基于数据解耦通讯的相关app!
1,--EventBus 基本信息:
compile 'de.greenrobot:eventbus:2.4.0'
1)使用起来特别简单,但是要懂原理;
2)要注意使用的步骤和流程;
3)主要作用:组件之间相互通讯、线程之间相互通讯等