博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dhroid - eventbus 事件总线
阅读量:5235 次
发布时间:2019-06-14

本文共 2505 字,大约阅读时间需要 8 分钟。

你听过onClick 事件,onItemClick 事件,事件总线不一定听过吧,
eventbus 事件总线也是一个编程思想,为什么要设计EventBus了,因为他是领域驱动设计中比不可少的模块,它承担传输数据的作用,它可以解耦模块之间的耦合性。
在过程中,我们总会遇到各个组件模块之间的通信,当功能点越来越多的时候,组件间的通信难免会变得混乱

 

我们还是用事例说明为什么要用eventbus
假设你有A,B,C,D,E,F几个页面,A 是列表,A->B,或者A->CB->D->E-FF 是发布页,A页面从B,C,D,E返回时都是不需要刷新的,只有从F返回,A才需要刷新这种情况不知道各位是怎么解决的

 

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

 

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

 

 

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

 

然后我们可以在需要监听事件的地方
//这个是在后台处理事件      bus.registerListener("事件名", "监听器名字", new OnEventListener(){                        @Override                        public Boolean doInBg(Event event) {                                 super.doInBg(event);                                 Log.v(log_tag, "我是在后台线程处理的请勿操作UI,我接受到的参数是"+event.getParams()[0]);                                return false;                        }                });或者        //这个是前台处理事件        bus.registerListener("事件名", "监听器名字", new OnEventListener(){                        @Override                        public Boolean doInUI(Event event) {                                 super.doInUI(event);                                      dialoger.showToastShort(EventBusOneActivity.this, 我是在UI线程处理的,我接受到的参数1是"+event.getParams()[0]+"我接受到的参数2是"+event.getParams()[1]);                                     return false;                        }                });

 

这样就可以注册事件监听了
发布事件
bus.fireEvent("事件名","可以传递多个参数","参数2");

 

取消监听
bus.unregisterListener("事件名","监听器名");

 

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

 

注意,我们的监听是有延时的,就是说registerListener时,eventbus会将之前发布的事件触发一下
,也就是说你先fireEvent,然后在registerListener也是可以监听到事件的
有人可能会问为什么会这样设计
因为我希望 A 页面中,在onResume中我们注册事件,在onStop中我们取消监听
如果你要清空你注册事件之前发布的事件可以
bus.clearEventTime("事件名", "监听名");

 

问题2解决,只需要在service中发布事件,在你有关的页面,监听事件就行
问题3解决, 先注册一个监听器,事件发布时网络获取用户信息,当用户更新头像后,发布一下事件就行

 

下面是用注解实现
@OnEvent(name="事件名",ui=true,onBefore=true)        public void onEvent2(String p1,String p2){                dialoger.showToastShort(this, "事件2触发参数1:"+p1+"参数2:"+p2 );        }

 

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

 

当然使用这个注解还需要
 
@Override        protected void onResume() {                super.onResume();                EventInjectUtil.inject(this);        }        @Override        protected void onStop() {                super.onStop();                EventInjectUtil.unInject(this);        }

 

你也可以写在onCreate 和finish里
 

 

转载于:https://www.cnblogs.com/niray/p/4650277.html

你可能感兴趣的文章
一、使用pip安装Python包
查看>>
spring与quartz整合
查看>>
3.Compound data types
查看>>
USACO Arithmetic Progressions 【构造等差数列】
查看>>
测试Writer
查看>>
caioj1441:第k小的数Ⅰ
查看>>
Kudu 常见的几个应用场景
查看>>
【设想】拯救小精灵
查看>>
HTML5 progress和meter控件
查看>>
A Byte of Python 笔记(11)异常:try..except、try..finally
查看>>
JSP中如何利用JS实现登录页面的跳转(JSP中如何利用JS实现跳转页面)
查看>>
构造函数和析构函数
查看>>
我的第一次总结
查看>>
Kattis之旅——Eight Queens
查看>>
小程序如何封装自定义组件(Toast)
查看>>
VS Code + Anaconda打造舒适的Python环境
查看>>
3.PHP 教程_PHP 语法
查看>>
readonly, const, static, static readonly 关键字实例说明
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
6.1.2.10 超链接美化
查看>>