1.认识EventBus
大家好,我是EventBus,我负责组件与组件间通讯,我的竞争对手是Itent,BroadCast,InterFace(回调函数),Bundle(Intent 传值),Binder(activity.bindService 回调。
我也负责线程间通讯,我的竞争对手是Hander。
他们能做的事情我也可以做,并且代码简洁,容易上手。
2.引入依赖
implementation 'org.greenrobot:eventbus:3.1.1'
3.消息类
消息类可以是任意class
public class MessageWrap {
public final String message;
public static MessageWrap getInstance(String message) {
return new MessageWrap(message);
}
private MessageWrap(String message) {
this.message = message;
}
}
4.订阅者
ActivityBus1 作为订阅者
threadMode有四种模式:
- 默认 发布者在哪个线程,接受者就在哪个线程
- ThreadMode.Main 接受者在主线程,不可耗时操作
- ThreadMode.BACKGROUND 发送子线程,接收就是同一线程,否则子线程
- ThreadMode.ASYNC 接收在新的线程中
activity_bus1:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:text="跳转"
android:layout_width="match_parent"
android:layout_height="40dp"></Button>
</LinearLayout>
public class ActivityBus1 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus1);
//1.注册时间
EventBus.getDefault().register(this);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getApplicationContext(), ActivityBus2.class));
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除注册
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventMainThread(MessageWrap msg){
Log.e("消息",msg.message);
}
}
5.发布者
public class ActivityBus2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus1);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(5000);//毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
EventBus.getDefault().post(MessageWrap.getInstance("你好"));
}
}).start();
}
});
}
}
单个消息发送接收的流程如图:
这个产品架构如下:
6.sticky 与 非sticky
上面实例是非粘性,就是注册必须发生在发送之前,如果注册发生在注册之后。需要这样:
6.1 发送
EventBus.getDefault().postSticky(MessageWrap.getInstance("你好"));
6.2 接收
在注解后加入 :sticky = true
@Subscribe(threadMode = ThreadMode.ASYNC,sticky = true)
public void onEventMainThread(MessageWrap msg){
Log.e("消息",msg.message);
}
}