您的位置:首页 > 其它

EventBus的使用以及消息处理

2018-02-27 11:25 507 查看
这篇帖子主要针对EventBus做一个简单的介绍使用以及遇到的问题处理。

首先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的使用以及消息处理简单的封装。

为EventBus消息添加一个intent-filter(过滤器)

淡定!没那么牛逼,就是利用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
4000
= object;
}

public int getTag() {
return tag;
}

public void setTag(int tag) {
this.tag = tag;
}
}


对封装EventBus进行封装

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> T getStickyEvent(Object subscriber, Class<T> 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> T removeStickyEvent(Object subscriber, Class<T> 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;
}
}


这样就能有效的区分哪些消息是当前订阅者需要接收的消息。

到此结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: