EventBus的使用以及消息处理
2018-02-27 11:25
507 查看
这篇帖子主要针对EventBus做一个简单的介绍使用以及遇到的问题处理。
EventBus github地址
大功告成,只待调用~~
先定义一个类用来当作消息体
对封装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; } }
这样就能有效的区分哪些消息是当前订阅者需要接收的消息。
到此结束!
相关文章推荐
- 使用单独的命令处理类来处理命令消息(适用于有很多命令处理函数的对象,以及共享命令处理函数)
- 使用单独的命令处理类来处理命令消息(适用于有很多命令处理函数的对象,以及共享命令处理函数)
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- 使用C#和MSMQ开发消息处理程序
- 使用C#和MSMQ开发消息处理程序(转)
- 关于ADO.Net使用TableAdapter时产生:更新要求有效的deletecommand或update,insert,selectcommand的解决办法,以及“违反并发性”处理
- VisualFC使用 - 处理WTL窗口消息
- MFC程序中消息以及函数的处理顺序简介!
- 使用Spring JMS简化异步消息处理
- 使用Spring JMS简化异步消息处理
- 使用Spring JMS简化异步消息处理
- 使用Spring JMS简化异步消息处理
- 使用Spring JMS简化异步消息处理
- 使用VC如何处理自定义消息
- 使用Spring JMS简化异步消息处理
- 从windows到linux的转换(1):信号与消息以及SIGPIPE 的处理
- C# 使用重载消息处理函数的方式,实现没有标题栏的窗体的拖动。
- 使用C#和MSMQ开发消息处理程序
- Linux下,使用C/C++编写一个简单的消息处理程序
- 使用Spring JMS简化异步消息处理