compile 'de.greenrobot:eventbus:2.4.0'
1)使用起来特别简单,但是要懂原理;
2)要注意使用的步骤和流程;
3)主要作用:组件之间相互通讯、线程之间相互通讯等
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!
post()方法里面的类型和onEvent()中的类型要一致。
package com.lantu.tuhuadmin.eventbus;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
/**
* Created on 2016/7/13.
* Author:chenrushui
* Description:一处点击发送数据,另一处或者多处可以及时获取更新传递过来的数据
* 设计知识点:事件类自定义、注册、订阅事件、事件的发布、数据解析、取消注册;
*/
public class FirstActivity extends Activity implements View.OnClickListener {
private Button btn_send;
private TextView tv_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
initViews();
initListener();
//注册一个事件接收者
EventBus.getDefault().register(this);
}
private void initListener() {
btn_send.setOnClickListener(this);
}
private void initViews() {
btn_send = (Button) findViewById(R.id.btn_send);
tv_content = (TextView) findViewById(R.id.tv_content);
}
//EventBus默认的接收事件处理的方法
public void onEvent(MyEvent myEvent) {
if (myEvent.getType().equals("0")) {
tv_content.setText(myEvent.getContent());
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_send: {
//点击操作就是发送数据事件
//自定义事件类
MyEvent myEvent = new MyEvent();
myEvent.setType("0");
myEvent.setContent("待传递的数据111");
EventBus.getDefault().post(myEvent);
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消EventBus注册
EventBus.getDefault().unregister(this);
}
}
自定义事件类:
package com.lantu.tuhuadmin.eventbus;
/**
* Created on 2016/7/13.
* Author:chenrushui
* Description:XXX
*/
public class MyEvent {
private String type;
private String content;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
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(对象)
事件总线分发流程:
描述了发布者和订阅者的关系。即:一个发布者 发布事件到总线,总线分发给订阅者。
观察者模式
按钮触发监听事件—->EventBus发送消息—->EventBus接收消息—->处理接收到的消息。
安卓平台上一个用于Activity,Fragment,Thread,Service被优化简化的通讯协议。少代码,高质量
它自定义事件类的功能特别强大, 有了这样定制消息的功能,我们就可以个性化消息,来对消息进行分类。
在EventBus中的观察者通常有四种订阅函数(就是某件事情发生被调用的方法)
1、onEvent()
2、onEventMainThread()
3、onEventBackground()
4、onEventAsync()
该方法将会在同一个线程来调用,避免了线程之间的切换,比如你是在主线程发送的消息,那么将会运行在主线程,如果为其他线程,那么将在其他线程调用。
// 在相同线程里调用 (默认)
public void onEvent(MessageEvent event) {
log(event.message);
}
将会在主线程调用,如果本身就在主线程,将直接调用
// 在主线程(UI线程)调用
public void onEventMainThread(MessageEvent event) {
//进行UI操作
textField.setText(event.message);
}
// 在后台线程调用
public void onEventBackgroundThread(MessageEvent event){
//进行耗时操作
saveToDisk(event.message);
}
观察者模式:
1、定义一个事件,这个事件一旦被EventBus分发出去就是代表某一件事情发生了,这个事件就是某个观察者关心的事情(不需要继承任何类)
2、定义观察者,然后将该观察者注册到EventBus
3、由EventBus分发事件,告知观察者某一件事情发生了.