Android各组件/控件间通信利器之EventBus
实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相 互关联性,其中用户对后者进行的某种操作会引起前者的相应改变。举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于每个糗事而言,布局基本 一致,在详情页点击了个赞,赞的数量增加,同时赞的图标发生了变化,此时返回到列表页,此糗事上的赞图标以及数量与刚刚详情页的需要保持一致。在举一个例 子,对于多个底部导航tab下的资讯类阅读app,在咨询详情页点击了收藏,然后收藏成功,此时回到底部tab中的个人中心,假如个人中心中有我的收藏, 同时后面显示的是收藏数量,此时此收藏数量需要同于于刚刚用户所进行的收藏/取消收藏而即时更改数字。凡此种种,类似需求场景非常常见。有时候,当此类需求相对简单时,通过接口以实现回调等方式可以完成,但是当不同组件/控件之间的关系纷繁复杂时,基于接口的方案不仅使得代码非常繁琐,同时是的程序逻辑很混乱,基于此EventBus,为此类需求的实现提供了非常方便的方案。网上已经有不少EventBus的使用介绍,在此简单介绍下完整的使用流程。
1. 首先定义事件基类(其实不定义也可以,定义后的好处在于在同一个回调函数中直接依据不同的子类事件类型可以直接继续逻辑上的处理,代码和逻辑更加简洁清晰)
public class BaseEvent {}
2. 定义具体的事件类型(以上述收藏事件为例)
public class FavorEvent extends BaseEvent {private int did;public FavorEvent() {}public FavorEvent(int did) {this.did = did;}public int getDid() {return did;}public void setDid(int did) {this.did = did;} }
3. 在需要监听此收藏事件的地方向EventBus注册事件监听器
EventBus.getDefault().register(this);
4. 当需要取消注册事件监听器时
EventBus.getDefault().unregister(this);
注:Android中,当遇到如EventBus中的register时,一般 的,相应都会有unregister逻辑。且经常register与unregister逻辑相互对应,处在如Activity等组件的不同生命周期中。 这是因为EventBus(其他也类似)在注册时由于是采用硬引用,存在潜在的内存泄露问题,而在相应生命周期中(如onDestroy)取消注册,即可 消除可能潜在的内存泄露问题。
5. 当事件发生时,需要通知相应事件监听器进行相应逻辑处理
告知EventBus进行了收藏操作,让其通知相关感兴趣方(主要的是通知个人中心页面改变我的收藏数量)
EventBus.getDefault().post(new FavorEvent());
6. 其他组件/监听器具体事件逻辑
public void onEvent(BaseEvent event) {// 接收收藏事件通知,同步处理收藏数字if (event instanceof FavorEvent) {// 即时更新收藏的数量(从sqlite中取得收藏数量) updateFavorNum();} else if(..){... }}
整个的使用流程主要也就这么多了,其中,关于子线程和UI线程之间等亦可进行类似事件通知,网上此类资料很多,不再赘述了。
源码:https://github.com/greenrobot/EventBus
转载于:https://www.cnblogs.com/wxishang1991/p/5212949.html
Android各组件/控件间通信利器之EventBus相关推荐
- android组建之间通信_Android各组件/控件间通信利器之EventBus
实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相互关联性,其中用户对后者进行的某种操作会引起前者的相应改变.举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于每 ...
- Android活动,控件,碎片,广播,数据库小总结
系统架构与开发环境搭建 3月2日Android Activities代码练习 3月5日 Intent的应用与传值 3月9日 1:显式Intent与隐式Intent的区别 显式Inten ...
- android组件圆角,Android实现圆角控件
Android实现圆角控件 在Android开发过程中,控件的使用是最常见.最基本的.但是我们都知道,在Android中的控件都是矩形的,而在实际项目中,我们的UI设计师经常会使用一些圆角的控件.那么 ...
- android verticalviewpager 下拉刷新 上拉加载_设计规范 | 详解组件控件结构体系:加载类...
设计师在进行APP设计时,往往会更加专注于界面的布局.界面和界面之间怎么跳转.操作反馈,却往往忽略掉一个比较重要的环节,就是APP数据加载中的设计.那么我们怎么处理好界面交互中的加载设计,保证体验无缝 ...
- 设计规范 | 详解组件控件结构体系
设计规范 | 详解组件控件结构体系 2018年4月16日luodonggan 什么是控件?什么组件?两者的区别是什么? Control翻译为控件,Component翻译为组件. 通俗的解释说法就是组件 ...
- Android的WebView控件载入网页显示速度慢的究极解决方案
Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] Android客户端中混搭HTML页面,会出现虽然H ...
- 004 Android之其他控件
文章目录 ListView ListView常用属性 ListView基本使用 ListView动态插入数据 ListView实现图文混排 Adapter Adapter(适配器种类) 自定义Adap ...
- android 如何拖动控件的实现
今天,简单讲讲android如何拖动控件. 之前,需要做一个功能,实现控件按照手势进行拖动,拖动到移动位置时可以进行一些操作.当时不知道怎么做,于是在网上查找了资料,终于是解决了这个问题.这里记录一下 ...
- android md 控件,Android基本UI控件.md
# Android基本UI控件 ## *TextView 文本框* ### TextView常用用法 | 主要方法 | 功能描述 | | :----------: | :--------------- ...
最新文章
- java怎么使用log函数_在使用couenne求解器的spyder中使用logof函数
- 判断是不是素数python_Python 判断是否为质数或素数的实例
- Android注册会员系统返回上一步时如何保存信息
- Perl一行式:处理空白符号
- 2022五一杯数学建模
- WordPress淘宝客ZZDGM主题Upanel插件使用补充
- Web组件开发一 分层详解 和模块化
- php在线编辑cad,cad形文件编辑器下载
- JavaScript 全栈工程师培训教程(React.js + Node.js)
- 【Matlab MTSP】灰狼算法求解多旅行商问题(同始终点)【含源码 1564期】
- VMwarex虚拟机打不开:“指定的文件不是虚拟磁盘”
- Github之First day on Github,带你学习并完成任务点,纯手敲超详细教程!(下)
- 2014微软校园招聘笔试试题(英文)
- matlab设置非平坦结构元,基于多尺度多结构元的数学形态学边缘检测
- Cool Edit 初学者 进行音频的编辑与处理 项目仿真 多媒体
- OA的部门管理和员工管理模块的实现总结
- slambook2 ch3 Ubuntu18.04下运行和调试
- vue - 比较两个日期大小、比较同一天两个时间大小(判断两个日期时间的大小)JS 解决方法
- 微信小程序wx.downloadFile()使用体验
- linux 解决安装Nvidia驱动后,或者声音选项里只有HDMI,声卡没有声音的方法[集锦]
热门文章
- [业界资讯]腾讯QQ同时在线用户数突破8000万
- 使用sublime编译运行C程序
- spark用python编程的书_PySpark实战指南:利用Python和Spark构建数据密集型应用并规模化部署...
- 量子不可克隆 计算机,量子不可克隆证明及推理
- android获取wifi连接状态,获取android设备wifi连接状态
- java从尾到头打印链表数据_Java编程实现从尾到头打印链表代码实例
- ArcGIS Engine10.4版本
- php udp发送和接收_php socket通信(tcp/udp)实例分析
- danfoss 变频器的profinet通讯调试_840D sl系统PLC 开机调试
- C++知识点56——类模板(1、模板类的介绍)