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. 当事件发生时,需要通知相应事件监听器进行相应逻辑处理
- 1 // 告知EventBus进行了收藏操作,让其通知相关感兴趣方(主要的是通知个人中心页面改变我的收藏数量)
- 2 EventBus.getDefault().post(new FavorEvent());
6. 其他组件/监听器具体事件逻辑
- public void onEvent(BaseEvent event) {
- // 接收收藏事件通知,同步处理收藏数字
- if (event instanceof FavorEvent) {
- // 即时更新收藏的数量(从sqlite中取得收藏数量)
- updateFavorNum();
- } else if(..){
- ...
- }
- }
整个的使用流程主要也就这么多了,其中,关于子线程和UI线程之间等亦可进行类似事件通知,网上此类资料很多,不再赘述了
Android各组件/控件间通信利器之EventBus的更多相关文章
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- 【风马一族_Android】第4章Android常用基本控件
第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...
- 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用
Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用 分类: Android UI ...
- 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用
Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...
- 【ALearning】第三章 Android基本常见控件
本章主要介绍主要的寻常较多使用的控件,包含TextView.EditView.ImageView.Button等.本章将介绍相关控件基本属性的使用,为以后章节的进阶学习提供基础.案例中引用的Linea ...
- 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView
本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...
- Android的WebView控件载入网页显示速度慢的究极解决方案
Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...
- android 自己定义控件
Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...
- Android笔记---常用控件以及用法
这篇文章主要记录下Android的常用控件以及使用的方法,Android 给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,这些是Android学习的基础,没有什么业 ...
随机推荐
- ngrok 外网访问小能手
以前在学校的时候想把自己做的网站发布让外网访问,可是又没有虚拟服务器和域名就显得异常的麻烦,曾经试过花生壳映射,效果虽然还不错,但是略显麻烦.今天找到一个更方便的小工具--ngrok ! 简单的介绍一 ...
- 《Linux内核分析》第四周 扒开系统调用的“三层皮”
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...
- JS-011-颜色进制转换(RGB转16进制;16进制转RGB)
在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...
- Android 通过 Wifi 调试 Debug (Android Studio)
参考资料: http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 前提: Android 手机 和 PC ...
- RDIFramework.NET V2.5(.NET快速信息化系统开发框架) Web版界面样例(可参考)
RDIFramework.NET V2.5(.NET快速信息化系统开发框架) Web版介绍 现已升级到V2.8,点击查看 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起 ...
- c# 相对路径的一些资料
1.获取和设置当前目录的完全限定路径. string str = System.Environment.CurrentDirectory; Result: C:\xxx\xxx 2.获取启动了应用程序 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- Spring框架简介 Spring Framework Introduction
Introduction The Spring Framework provides a comprehensive programming and configuration model for m ...
- Number类型方法
//1.toString(); 转换成字符串 var s=123; console.log(typeof s.toString()); //string //2.toLocaleString() ...
- python 清楚数组重复字符串元素
l1 = ['bb','c','d','bb','c','a','a'] l2 = {}.fromkeys(l1).keys() print (l2)