EventBus3.0
Gradle依赖:
implementation 'org.greenrobot:eventbus:3.0.0'
结构:
-
Event:事件
-
Publisher:发送者,发送需要处理的消息
-
Subscriber:订阅者,定义事件处理方法,必须通过
register
方法来注册。
线程:
-
POSTING (默认):在发送事件的线程处理事件
-
MAIN:主线程处理
-
BACKGROUND:后台线程处理,如果主线程发送,则新建线程
-
ASYNC:始终在其他线程处理
使用方法:
1.定义Event:
public class EventMsg {
public EventMsg(String msg){
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
String msg;
}
- 在需要处理事件类中注册EventBus,如果是Activity或者Fragment等有生命周期的组件,需要在销毁时解除注册,以防内存泄漏。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
- 定义事件处理方法,在3.0以前方法名是固定的,3.0以后可以通过注解指定:
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleMessage(EventMsg msg) {
Toast.makeText(this,"Received message: " + msg.getMsg(), Toast.LENGTH_SHORT).show();
}
- 发送事件:
EventBus.getDefault().post(new EventMsg("Event Bus 3.0!!"));
注意:一个事件只能被处理一次。
- 粘性事件:
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void handleMessage(EventMsg msg) {
Toast.makeText(this,"Received message: " + msg.getMsg(), Toast.LENGTH_SHORT).show();
}
EventBus.getDefault().postSticky(new EventMsg("Event Bus 3.0!!"));
粘性事件:事件发出之后可以作为普通事件被没有 sticky = true
修饰的方法处理,但是处理完之后事件不会消失,后续新增的订阅者依然可以收到该事件,但是处理方法必须有 sticky = true
修饰。如果想要移除粘性事件,需要手动移除:
EventBus.getDefault().removeStickyEvent(EventMsg.class);
EventBus.getDefault().removeStickyEvent();
网友评论