本篇文章主要介绍以几下个知识点:
- 使用 EventBus 的步骤
- 一个简单的demo
1. EventBus 简介
**EventBus ** 是一个基于观察者模式的 publisher/subscriber 事件总线。通过极少的代码实现模块间的通信,使用方便,性能高,降低耦合。官方架构图如下:
EventBus 的项目主页地址:
https://github.com/greenrobot/EventBus
EventBus 的官方介绍:
http://greenrobot.org/eventbus/
2. 使用 EventBus 的步骤
首先在项目中添加 EventBus 依赖:
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
}
EventBus 的基本用法很简单,有如下几个步骤:
步骤 1:定义事件(Define events)
定义事件类似定义一个实体类,如定义两个事件如下:
/**
* Function:定义消息事件
* Author:Wonderful on 2017/3/11 09:26
*/
public class MessageEvent {
public final String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
}
/**
* Function:定义其他事件
* Author:Wonderful on 2017/3/11 09:41
*/
public class SomeOtherEvent {
public final String something;
public SomeOtherEvent(String something) {
this.something = something;
}
}
步骤 2:准备订阅者(Prepare subscribers)
订阅者实现事件处理方法,这个方法会在事件提交的时候被调用。需使用@Subscribe注解定义,如下:
/**
* This method will be called when a MessageEvent is posted (in the UI thread for Toast)
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
Log.i("onMessageEvent-------->",event.msg);
ToastUtils.show(event.msg);//弹吐司显示信息
}
/**
* This method will be called when a SomeOtherEvent is posted
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSomethingElse(SomeOtherEvent event){
Log.i("handleSomethingElse--->",event.something);
ToastUtils.show(event.something);
}
值得注意的是,注册监听模块必须有一个标注Subscribe注解方法,否则在register时会抛出异常。注解的几个参数如下(可以点击相关链接查看官方介绍):
- threadMode:回调所在的线程
ThreadMode: POSTING(默认使用)
ThreadMode: MAIN(UI线程)
ThreadMode: BACKGROUND
ThreadMode: ASYNC - priority: 优先级(默认是 0)
- sticky: 是否接收黏性事件
准备完订阅者别忘了添加注册和注销订阅者,如下:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
值得注意的是:实际使用中,register、unregister 通常与 Activity、Fragment 的生命周期相关,比如当你在第一个界面准备好订阅者,点击某个控件跳转到第二个界面,在第二个界面点击某个控件提交事件并关闭第二个界面,此时要想在第一个界面的订阅者接受到事件做出响应,那么上面在 onStart() 中注册就可能无效了,此时应该在onCreate() 方法中注册。我会选择在 onCreate() 和 onDestroy() 中分别进行注册和注销:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
步骤 3:提交事件( Post events)
提交事件很简单,在代码中任意位置都可以提交事件。如下:
EventBus.getDefault().post(new MessageEvent("Hello everyone"));
3. 一个简单的Demo
利用 EventBus 实现点击按钮提交事件,订阅者接收到事件后弹出吐司提示事件内容,以及在第二个activity 点击按钮提交事件并且关闭后,在第一个activity中接收到第二个activity提交的事件并作出响应,如下:
首先定义事件:
/**
* Function:定义消息事件
* Author:Wonderful on 2017/3/11 09:26
*/
public class MessageEvent {
public final String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
}
/**
* Function:定义其他事件
* Author:Wonderful on 2017/3/11 09:41
*/
public class SomeOtherEvent {
public final String something;
public SomeOtherEvent(String something) {
this.something = something;
}
}
接着准备订阅者以及提交事件:
public class EventBusActivity extends AppCompatActivity {
TextView tv_show;//显示内容
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
EventBus.getDefault().register(this);
findViewById(R.id.post_message_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 提交事件
EventBus.getDefault().post(new MessageEvent("哈,这是EventBusActivity提交的事件"));
}
});
findViewById(R.id.to_other_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 跳转到 SomeOtherActivity
IntentUtils.to(EventBusActivity.this,SomeOtherActivity.class);
}
});
tv_show = (TextView) findViewById(R.id.tv_show);
}
/**
* This method will be called when a MessageEvent is posted (in the UI thread for Toast)
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
//弹吐司显示EventBusActivity中提交事件的信息
ToastUtils.show(event.msg);
}
/**
* This method will be called when a SomeOtherEvent is posted
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSomethingElse(SomeOtherEvent event){
//设置接收SomeOtherActivity中提交事件的内容
tv_show.setText(event.something);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
public class SomeOtherActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_some_other);
findViewById(R.id.post_some_other_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new SomeOtherEvent("这是SomeOtherActivity提交的事件红红火火"));
finish();
}
});
}
}
好了,本篇文章就介绍到这,只是简单的基本使用,想要了解更多去看看官方介绍,相信你收获更大。