1 使用方式
注册
EventBus.getDefault().register(this);
定义消息类型
public class EventA {
String message;
public EventA(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
接收通知的回调
@Subscribe
public void onEventReceive(EventA eventA) {
}
解绑
EventBus.getDefault().unregister(this);
发送
EventBus.getDefault().post(new EventA("message"));
2 示例
- 在MainActivity中启动SecondActivity。
- 在MainActivity中重写带有@Subscribe注释的方法,用于接收事件的回调。
- 在SecondActivity中发送事件。
接收方
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
Button button = findViewById(R.id.btn_main_start);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
}
@Subscribe
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity",eventA.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
发送方
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button button = findViewById(R.id.btn_second_send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new EventA("send message from SecondActivity"));
}
});
}
}
当点击SecondActivity中的按钮后,会在log中看到
I/TAG-MainActivity: send message from SecondActivity
3 控制接收方法运行的线程
public enum ThreadMode {
POSTING,//和发送线程在同一个线程
MAIN, //运行在主线程
BACKGROUND, //运行在子线程
ASYNC //和发送线程分离的线程池中
}
POSTING:订阅者的方法将会运行在发布所在的线程,这种模式是默认的。在此回调方法中的处理也要尽量的快。因为发布所在的线程可能是主线程。
MAIN:订阅者的方法将会在主线程中被调用,在此回调方法中要尽量快,以避免阻塞主线程。
BACKGROUND:订阅者的方法将会在工作线程中调用,如果发布所在的线程不是主线程,那么订阅者的方法会直接在此线程中调用。如果发布所在线程是主线程,事件将会在线程中去执行。在此线程中处理的内容要尽量的快,以避免阻塞此工作线程。
ASYNC:将会运行在和发布所在线程分离的线程池中。在回调方法中可以执行耗时的操作,比如网络访问等。为了避免启动多个耗时操作会限制并发数量,所以采用线程池来提高效率。
默认和发布线程在同一个线程中运行
默认的是和发送通知的线程运行在同一个线程即(threadMode = ThreadMode.POSTING)
添加在接收的方法中查看线程代码,其他不变。
@Subscribe
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
运行结果
I/TAG-MainActivity: currentThread name:main
POSTING
在主线程中发送
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new EventA("send message from SecondActivity"));
}
});
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
打印结果:
I/TAG-MainActivity: currentThread name:main
可以看到接收方法运行在主线程。
在子线程中发送
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
super.run();
EventBus.getDefault().post(new EventA("send message from SecondActivity"));
}
}.start();
}
});
接收
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
打印结果
I/TAG-MainActivity: currentThread name:Thread-1722
MAIN
修改接收方法的注释参数后
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
在主线程中发送的打印结果
I/TAG-MainActivity: currentThread name:main
在子线程中发送的打印结果
I/TAG-MainActivity: currentThread name:main
BACKGROUND
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
在主线程中发送的打印结果
I/TAG-MainActivity: currentThread name:pool-1-thread-1
在子线程中发送的打印结果
I/TAG-MainActivity: currentThread name:Thread-1742
ASYNC
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventReceive(EventA eventA) {
Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
}
在主线程中发送的打印结果
I/TAG-MainActivity: currentThread name:pool-1-thread-1
打印子线程的线程名称
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
super.run();
Log.i("TAG-SecondActivity","currentThread name:"+Thread.currentThread().getName());
EventBus.getDefault().post(new EventA("send message from SecondActivity"));
}
}.start();
}
});
在子线程中发送的打印结果
I/TAG-SecondActivity: currentThread name:Thread-1763
I/TAG-MainActivity: currentThread name:pool-1-thread-1