EventBus 最新上手指南
简介
EventBus 是一款针对 Android 优化的发布/订阅事件总线。主要功能是替代 Intent,Handler,BroadCast在 Fragment,Activity,Service,线程之间传递消息。优点是开销小,代码更优雅。以及将发送者和接收者解耦。
使用
- 第一步:定义 events 对象
public class MessageEvent { ... }
- 第二步:订阅 events 事件
在Activity和Fragment等的生命周期内,注册/注销订阅事件。例如:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
处理订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
- 第三步:发布 evnets 事件
EventBus.getDefault().post(new MessageEvent());
简简单单的三步就完成事件的发送和接收,它可以在不同的Activity之间发送和接收数据,非常方便。如果我们 post 不同的事件对象就要实现相应的订阅事件函数。即我 post(B) 就要实现 onMessageEvent(B) 方法。
ThreadMode 的几种方法
ThreadMode 总共提供了 5 中模式,分别是 POSTING、MAIN、MAIN_ORDERED、BACKGROUND、ASYNC。其分别代表的意义如下:
Mode | 意义 |
---|---|
POSTING | 订阅和发送的事件在同一个线程中处理 |
MAIN | 不管事件在什么线程中发布,订阅的事件都在主线程中处理 |
MAIN_ORDERED | 不管事件在什么线程中发布,订阅的事件都在主线程中依次处理 |
BACKGROUND | 如果发布的事件是在子线程中,订阅的事件就在同一子线程中处理。如果发布的事件是在主线程中,订阅的事件就在EventBus创建的子线程中处理 |
ASYNC | EventBus创建一个独立的线程来处理订阅的事件 |
依赖
在项目中添加对 EventBus 的依赖。
Gradle:
implementation 'org.greenrobot:eventbus:3.1.1'
Maven:
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.1.1</version>
</dependency>
jar
测试
前面基本上把 EventBus 需要用到的东西都介绍完了。下面我们就开始动手测试 EventBus 的功能吧。
SecondActivity.java
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.id_btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
MessageEvent event = new MessageEvent();
event.message = "Hello";
EventBus.getDefault().post(event);
MessageEventA eventA = new MessageEventA();
eventA.message = "Hello";
EventBus.getDefault().post(eventA);
MessageEventB eventB = new MessageEventB();
eventB.message = "Hello";
EventBus.getDefault().post(eventB);
MessageEventC eventC = new MessageEventC();
eventC.message = "Hello";
EventBus.getDefault().post(eventC);
MessageEventD eventD = new MessageEventD();
eventD.message = "Hello";
EventBus.getDefault().post(eventD);
Log.d("TAG", "post:"+Thread.currentThread().getName());
}
}).start();
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG", "onStart");
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG", "onStop");
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Log.d("TAG", "SecondActivity onMessageEvent MAIN:"+event.message+",thread:"+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(MessageEventA event) {
Log.d("TAG", "SecondActivity onMessageEvent POSTING: "+event.message+",thread:"+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessageEvent(MessageEventB event) {
Log.d("TAG", "SecondActivity onMessageEvent MAIN_ORDERED:"+event.message+",thread:"+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessageEvent(MessageEventC event) {
Log.d("TAG", "SecondActivity onMessageEvent BACKGROUND:"+event.message+",thread:"+Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessageEvent(MessageEventD event) {
Log.d("TAG", "SecondActivity onMessageEvent ASYNC:"+event.message+",thread:"+Thread.currentThread().getName());
}
public class MessageEvent {
public String message;
}
public class MessageEventA {
public String message;
}
public class MessageEventB {
public String message;
}
public class MessageEventC {
public String message;
}
public class MessageEventD {
public String message;
}
布局文件就不贴了,就一个按钮。同时,记得加上对 EventBus 的依赖。
测试代码写完了,运行后,结果如下:
该测试代码基本上把相关的方法都测试了一下,不同的对象事件发送接收,不同的 ThreadMode 的处理线程等。这里只测试了同一个Activity之间的发布订阅,在不同的 Activity 之间订阅相同的事件也是一样的,这里就不上过多代码了。EventBus 上手还是非常简单的。在项目中引用 EventBus 可以简化不同 Activity、Fragment 之间的数据传递,方便你我他。