这篇帖子主要针对EventBus做一个简单的介绍使用以及遇到的问题处理。
EventBus是一个消息总线,以观察者模式实现发布者/订阅者模式进行松散耦合的Android开源库。使 Widget,Activity,Fragment,Service以及Thread之间能更好的通信。
EventBus官网地址
EventBus github地址
在gradle中引入
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// ......
compile 'org.greenrobot:eventbus:3.0.0'
}
大功告成,只待调用~~
当EventBus出现多个订阅者的时候,post同一种类型的消息,发送多条消息时,不知道消息从哪里发出以及订阅在哪块,在这种状况下它的可读性大大降低。下面主要是针对EventBus的使用以及消息处理简单的封装。
淡定!没那么牛逼,就是利用intent-filter中action的思想为每种消息体添加一个tag,利用这个tag去辨别订阅到的这条消息是否是自己想要的那条消息。
public class EventBusMessage {
public Object object;// EventBus消息对象
public int tag;// 消息TAG
public EventBusMessage(Object object, int tag) {
this.object = object;
this.tag = tag;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public int getTag() {
return tag;
}
public void setTag(int tag) {
this.tag = tag;
}
}
public class EventBusHelper {
private static final String TAG = EventBusHelper.class.getSimpleName();
/**
* 注册/销毁
*
* @param object
* @param register 注册状态:true注册,false:销毁
*/
public static void register(Object object, boolean register) {
if (object != null) {
if (register) {
if (!EventBus.getDefault().isRegistered(object)) {
EventBus.getDefault().register(object);
}
} else {
if (EventBus.getDefault().isRegistered(object)) {
EventBus.getDefault().unregister(object);
}
}
}
}
/**
* 默认post数据
*
* @param object 发送对象
*/
public static void post(Object object) {
EventBus.getDefault().post(object);
}
/**
* 带Tag post数据
*
* @param subscriber 发送对象
* @param tag 为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
*/
public static void post(Object subscriber, int tag) {
EventBusHelper.post(new EventBusMessage(subscriber, tag));
}
/**
* 默认post粘性事件
*
* @param object
*/
public static void postSticky(Object object) {
EventBus.getDefault().postSticky(object);
}
/**
* 带Tag post粘性事件
*
* @param subscriber 发送对象
* @param tag 为发送的对象设置一个TAG,因为EventBus属于观察者模式,设置TAG的目的主要是为了在指定的地方接收指定的消息。
*/
public static void postSticky(Object subscriber, int tag) {
EventBusHelper.postSticky(new EventBusMessage(subscriber, tag));
}
public static T getStickyEvent(Object subscriber, Class clazz) {
if (EventBus.getDefault().isRegistered(subscriber)) {
return EventBus.getDefault().getStickyEvent(clazz);
} else {
Log.e(TAG, "EventBus no register");
return null;
}
}
/**
* 删除指定粘性事件
*
* @param clazz
*/
public static T removeStickyEvent(Object subscriber, Class clazz) {
if (EventBus.getDefault().isRegistered(subscriber)) {
return EventBus.getDefault().removeStickyEvent(clazz);
} else {
Log.e(TAG, "EventBus no register");
return null;
}
}
/**
* 删除所有粘性事件
*/
public static void removeAllStickyEvents(Object subscriber) {
if (EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().removeAllStickyEvents();
} else {
Log.e(TAG, "EventBus no register");
}
}
/**
* 取消事件发送
*
* @param object
*/
public static void cancelEventDelivery(Object subscriber, Object object) {
if (EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().cancelEventDelivery(object);
} else {
Log.e(TAG, "EventBus no register");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ......
EventBusHelper.register(this, true); // 注册EventBus
// ......
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 发送消息
EventBusHelper.post(new EventBusMessage("EventBus是一个消息总线", 1001));
}
});
}
// ......
@Override
protected void onDestroy() {
EventBusHelper.register(this, false); // 销毁EventBus
super.onDestroy();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(EventBusMessage message) {
switch (message.tag){
case 1001:
Toast.makeText(this, (String) message.object, Toast.LENGTH_SHORT).show();
break;
}
}
这样就能有效的区分哪些消息是当前订阅者需要接收的消息。
到此结束!