EventBus 概述
一套 Android Java 事件订阅 / 发布框架,由 greenrobot 团队开源。
作用:在组件 / 线程间通信的场景中,将数据或事件传递给对应的订阅者
使用原因:EventBus比传统的接口监听、Handler、LocalBroadcastManager更简单可靠。
优点:
1.使用事件总线框架,实现事件发布者与订阅者松耦合。
2.提供透明线程间通信,隐藏了发布线程与订阅线程间的线程切换。
角色分工
三个角色
Event:事件,它可以是任意类型,EventBus会根据事件类型进行全局的通知。
Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe,并且指定线程模型,默认是POSTING。
Publisher:事件的发布者,可以在任意线程里发布事件。一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
订阅者注解特性
Demo
下面用一个简单的例子介绍一下EventBus的使用,这个例子实现的功能是:有界面1、界面2、两个界面,界面1跳转到界面2,界面2返回界面1时,带回一个参数,并且在界面1中以Toast方式展现。
1.引入依赖
引入 implementation ‘org.greenrobot:eventbus:3.1.1’
2.由目标可得出SecondActivity是事件发布,MainActivity是事件订阅
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
@Subscribe
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册MainActivity为订阅者
EventBus.getDefault().register(this);
button = findViewById(R.id.button1);
textView = findViewById(R.id.tv_maintext);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(FirstEvent event) {
Toast.makeText(this, event.getStrMsg(),Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//反注册
EventBus.getDefault().unregister(this);
}
}
public class SecondActivity extends AppCompatActivity {
private Button btn_second;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
btn_second = findViewById(R.id.btn_second);
btn_second.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new FirstEvent("我只有感叹号!!!"));
finish();
}
});
}
}
两个xml文件分别如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_maintext"
android:text="小朋友 你是否有很多的问号?"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button1"
android:text="Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<Button
android:id="@+id/btn_second"
android:text="!!!!!"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
定义事件:定义一个事件的封装对象。在程序内部就使用该对象作为通信的信息:
public class FirstEvent {
private String strMsg;
public FirstEvent(String strMsg) {
this.strMsg = strMsg;
}
public String getStrMsg() {
return strMsg;
}
}