分享

eventbus 事件总线

 aaie_ 2017-04-12

你听过onClick 事件,onItemClick 事件,事件总线不一定听过吧,

eventbus 事件总线也是一个编程思想,为什么要设计EventBus了,因为他是领域驱动设计中比不可少的模块,它承担传输数据的作用,它可以解耦模块之间的耦合性。

在android开发过程中,我们总会遇到各个组件模块之间的通信,当功能点越来越多的时候,组件间的通信难免会变得混乱

 

我们还是已事例说明为什么要用eventbus

 

 

Java代码  收藏代码
  1. 假设你有A,B,C,D,E,F几个页面,  
  2. A 是列表,A->B,或者A->C  
  3. B->D->E-F  
  4. F 是发布页,  
  5. A页面从B,C,D,E返回时都是不需要刷新的,只有从F返回,A才需要刷新  
  6. 这种情况不知道各位是怎么解决的  

 

Java代码  收藏代码
  1. 在说个你有一个service是轮询后台服务器的查看用户消息数,当有新消息时,如果用户在msg页面,需要刷新当前页  
  2. 你是通过广播机制处理吗?写起来很烦吧  

 

 

Java代码  收藏代码
  1. 还有假设在第一个页面的左侧滑中,会显示用户的头像,用户名等信息,你是每次打开侧滑时你是一直获取数据吗,当然有人知道可以放到perference中  
  2. 但是什么时候更新perference中的数据了,用户更新了各种资料,发布了什么都可以更新数据,维护这个更新也不容易吧  

说了这么多一直没说重点下下面开始

 

使用eventbus只需要在类中注入一个eventbus单例接口(IOC的知识请先看前面的文档)

 

Java代码  收藏代码
  1. @Inject  
  2. EventBus bus;  

 然后我们可以在需要监听事件的地方

 

 

Java代码  收藏代码
  1.    //这个是在后台处理事件  
  2.     bus.registerListener("事件名""监听器名字"new OnEventListener(){  
  3.     @Override  
  4.     public Boolean doInBg(Event event) {  
  5.          super.doInBg(event);  
  6.          Log.v(log_tag, "我是在后台线程处理的请勿操作UI,我接受到的参数是"+event.getParams()[0]);  
  7.         return false;  
  8.     }  
  9. });  
  10.   
  11.       //这个是前台处理事件  
  12. us.registerListener("事件名""监听器名字"new OnEventListener(){  
  13.     @Override  
  14.     public Boolean doInUI(Event event) {  
  15.          super.doInUI(event);  
  16.                      dialoger.showToastShort(EventBusOneActivity.this, 我是在UI线程处理的,我接受到的参数1"+event.getParams()[0]+"我接受到的参数2是"+event.getParams()[1]);  
  17.                     return false;  
  18.     }  
  19. });  

 这样就可以注册事件监听了

发布事件

Java代码  收藏代码
  1. bus.fireEvent("事件名","可以传递多个参数","参数2");  

取消监听

Java代码  收藏代码
  1. bus.unregisterListener("事件名","监听器名");  

 

 

 

 

上面是事件监听和发布的基本模式

 

注意,我们的监听是有延时的,就是说registerListener时,eventbus会将之前发布的事件触发一下

,也就是说你先fireEvent,然后在registerListener也是可以监听到事件的

有人可能会问为什么会这样设计

因为我希望 A 页面中,在onResume中我们注册事件,在onStop中我们取消监听

如果你要清空你注册事件之前发布的事件可以

 

Java代码  收藏代码
  1. bus.clearEventTime("事件名""监听名");  

 

 

 

 

问题2解决,只需要在service中发布事件,在你有关的页面,监听事件就行

问题3解决, 先注册一个监听器,事件发布时网络获取用户信息,当用户更新头像后,发布一下事件就行

 

下面是用注解实现

 

   

Java代码  收藏代码
  1.    @OnEvent(name="事件名",ui=true,onBefore=true)  
  2. ublic void onEvent2(String p1,String p2){  
  3. dialoger.showToastShort(this"事件2触发参数1:"+p1+"参数2:"+p2 );  

 

注解name参数,事件名,ui是否在ui线程,onBefore=true,可以监听事件监听前的事件

 

当然使用这个注解还需要

 

Java代码  收藏代码
  1.     @Override  
  2.     protected void onResume() {  
  3.         super.onResume();  
  4.         EventInjectUtil.inject(this);  
  5.     }  
  6.     @Override  
  7.     protected void onStop() {  
  8.         super.onStop();  
  9.         EventInjectUtil.unInject(this);  
  10.     }  
  11. 你也可以写在onCreate 和finish里 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多