EventBus|EventBus 的简单使用
一, 在使用EventBus之间先简单的概述下EventBusEventBus其实也是粘性事件
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接口发布事件。
四,EventBus的四种线程模型(ThreadMode)
- POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起应用程序无响应(ANR)。
- MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
- BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
- ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
EventBus 简单介绍完毕接下来讲EventBus的使用
如何使用
- 注册事件EventBus.getDefault().register( this );
- 取消注册EventBus.getDefault().unregister( this );
- 发送数据EventBus.getDefault().post( "我发射了");
一,导依赖
implementation 'de.greenrobot:eventbus:3.0.0-beta1'
二,在MainActivity中去注册和取消注册
@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;
} }
四,发送消息
【EventBus|EventBus 的简单使用】
@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);
}
SecondActivity
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();
} });
} }
我记得一个Activty中只能接受一次事件如果大于1会报错
转载说明出处 https://blog.csdn.net/qq_42046338/article/details/81542912
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量