唉,昨天去滑雪,回来太累,果然忘记更了。看来坚持还是需要一些实力的。今天就不牢骚了。来点干货
EventBus 3.0 简单使用和优美封装···
首先,附上eventBus的github地址
我是用的Android Studio版本为3.2.1(这个其实不重要啦)
gradle配置
implementation 'org.greenrobot:eventbus:3.1.1'
为了使用和修改时方便,将EventBus进行了一个工具类的封装(EventBusUtils):
注册和反注册
public static void register(Object subscribe) {
EventBus.getDefault().register(subscribe);
}
public static void unregister(Object subscribe) {
EventBus.getDefault().unregister(subscribe);
}
发送事件方法
public static void post(EventMessage event) {
EventBus.getDefault().post(event);
}
// 粘性事件发送
// poststicky 作用:只指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。
public static void postSticky(EventMessage stickyEvent) {
EventBus.getDefault().postSticky(stickyEvent);
}
在activity或者fragment的onCreate中(也可以在onStart/onResume)注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册eventbus
EventBusUtils.register(this);
}
在onDestroy中(也可以在onStop/onPause)反注册
@Override
protected void onDestroy() {
super.onDestroy();
if (EventBusUtils.isRegist(this)) {
EventBusUtils.unregister(this);
}
}
EventBus3.0有四种线程模型,分别是:
- POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
在注册eventBus的activity/fragment中按需添加以下事件接收处理方法,处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型。
// 在主线程处理
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainThread(EventMessage event) {
Logger.i("MainThread: " + Thread.currentThread().getName());
}
// 在主线程处理粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMainStickyThread(EventMessage event) {
Logger.i("MainStickyThread: " + Thread.currentThread().getName());
}
// 在后台处理事件
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackgroundThread(EventMessage event) {
Logger.i("BackgroundThread: " + Thread.currentThread().getName());
}
// 在发送事件的同一线程中处理事件
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostThread(EventMessage event) {
Logger.i("PostThread: " + Thread.currentThread().getName());
}
在需要发送事件的地方调用post方法:
@Override
public void onClick(View v) {
switch (v.getId()) {
case okButtonId:
EventMessage<String> event = new EventMessage.Builder()
.setCode(EventConst.EVENT_CODE_OK)
.setEvent("这是一个普通事件")
.setFlag(EventConst.CHECK_DRIVER_SUCCESS)
.create();
//发送普通事件
EventBusUtils.post(event);
this.finish();
break;
}
}
贴上自己创建的事件EventBusMessage类(本类不固定,可以按照自己的想法创建):
public class EventMessage<T> {
private int code;
private String flag;
private T event;
public EventMessage(int code, String flag, T event) {
this.code = code;
this.flag = flag;
this.event = event;
}
public int getCode() {
return code;
}
public String getFlag() {
return flag;
}
public T getEvent() {
return event;
}
public static class Builder<T> {
private int code;
private String flag;
private T event;
public Builder setCode(int code) {
this.code = code;
return this;
}
public Builder setFlag(String flag) {
this.flag = flag;
return this;
}
public Builder setEvent(T event) {
this.event = event;
return this;
}
public EventMessage create() {
return new EventMessage<T>(code, flag, event);
}
}
}
以上步骤就是eventbus 3.0的使用步骤了,以上的封装纯属个人喜好,仅供参考。
当然为了使用起来也可以在BaseActivity和BaseFragment中进行一些公共的操作,比如注册和解除注册,事件接收方法。然后在使用时对方法重写即可。
附上demo地址: 码云
(demo很简单)
网友评论