EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架。EventBus是一个Android端优化的publishsubscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
基本上所有方法都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。
普通的事件我们通过post发送给EventBus,发送过后之后当前已经订阅过的方法可以收到。但是如果有些事件需要所有订阅了该事件的方法都能执行呢?例如一个Activity,要求它管理的所有Fragment都能执行某一个事件,但是当前我只初始化了3个Fragment,如果这时候通过post发送了事件,那么当前的3个Fragment当然能收到。但是这个时候又初始化了2个Fragment,那么我必须重新发送事件,这两个Fragment才能执行到订阅方法。
粘性事件就是为了解决这个问题,通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。
1,事件Event: 又可成为消息,其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型EventType是指事件所属的Class。
事件分为一般事件和Sticky事件,相对于一般事件,Sticky事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件的最近一个Sticky事件。
2,订阅者Subscriber: 订阅某种事件类型的对象,当有发布者发布这类事件后,EventBus会执行订阅者的onEvent函数,这个函数叫事件响应函数。订阅者通过register接口订阅某个事件类型,unregister接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为0。
3,发布者Publisher: 发布某事件的对象,通过post接口发布事件。
简单看以上的如何使用其实还是模糊的但只要只要这样有 3 中方式咋没呢接下来的进行将更顺利
implementation 'de.greenrobot:eventbus:3.0.0-beta1'
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在OnCreate中注册
EventBus.getDefault().register(this);
}
//并在Actvity的生命周期中的销毁中调用我们的取消注册不取消注册能会造成内存方面的问题
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
//为什么定义此类, 此类就是你要发送的任何东西当然也可以是你的实体类对象
//我这边简单使用一个字符串进行示范
public class MessageEvent {
public String name;
public MessageEvent(String name {
this.name = name;
}
//定义的此方法是你Ben对象获取数据的方法下面继续看就会懂
public String getname() {
return name;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册
EventBus.getDefault().register( this );
//是用布局中一个按钮进行示范
findViewById( R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
/**
* 自定义一个方法 onEvent() ,用来接收事件。
* 方法名字可以随便写
* @return
*/
//订阅事件:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent messageEvent ) {
String msg = messageEvent .getname();
mInfoTxt.setText(msg);
}
//并在Actvity的生命周期中的销毁中调用我们的取消注册不取消注册能会造成内存方面的问题
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
public class SecondActivity extends AppCompatActivity {
@Bind(R.id.btn_post)
Button mPostBtn;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ButterKnife.bind(this);
mPostBtn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
new Thread(new Runnable() { @Override public void run() {
//发送事件
EventBus.getDefault().post(new MessageEvent ("Just do it"));
} }).start();
} });
} }
转载说明出处 https://blog.csdn.net/qq_42046338/article/details/81542912