Android实用开源库-EventBus

新技能get

事情是这样的,公司项目还处于一个从0到1的过程,一个登录模块,用户登录完了要刷新各种数据,完成各种回调。为了将来好维护,少挖坑,一开始准备使用观察者,这样会比较优雅。但是JAVA的Observer用起来还是不太方便,无奈时间太紧迫,已经做好通宵准备了。旁边的小伙伴提醒用EventBus,粗略的查了下使用方法,依葫芦画瓢,原本很大的工作量,居然秒秒钟就搞定了,EventBus真乃神器,新技能+1。

EventBus简介

原以为EventBus要翻译为“事件车”,查了下这里bus是总线的意思。EventBus是基于JVM内部的数据传输系统,其的核心对象为Event和EventHandler。个人感觉EventBus和android中的BroadCast很像,但是使用起来却要简单的多。例如A、B两个Activity或者Fragment,A中发生了一件事的同时要通知B做出相应的改变,假如A、B存在调用关系,还可以通过intent,handler,或者接口回调等来解决。假如A、B八竿子打不着,也可以用BroadCast来传递消息。但是BroadCast这个方案还是太重了,现在有一个比较轻量级的解决方案:EventBus,几乎可以完成各种类型的事件传递,没有做不到,只有想不到。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

使用方法

上面已经说过了,EventBus是基于发布/订阅这一模型来设计的,说的通俗点就是设计模式中的观察者模式。使用也很既简单,整个事件中:被观察者发布消息,观察者订阅消息,收到消息后do something。

事件

首先被观察者和观察者之间约定一个统一的事件,可以理解为信号。这里需要一个类,可以是一个空类

public class Event {  
     public Event(){}  
 } 

这样就可以了。

被观察者发布事件
EventBus.getDefault().post(newEvent());

就这一句就可以了,这里其实是个单例,EventBus.getDefault()其源码里就相当于是EventBus.getInstance()

观察者监听事件

1:在观察者页面去接收事件

publicvoidonEvent(Eventevent){}

这个方法不需要你去写调用,就放心大胆的在里面写接收到事件后,你想干的事。

2:在oncreat()或者其他合适的地方注册监听事件

EventBus.getDefault().register(this);

这register(this)是干嘛的呢?其实register(this)就是去当前类,遍历所有的方法,找到onEvent开头的然后进行存储。现在知道onEvent开头的方法是干嘛的了吧。
3:解除注册,在ondestroy()或其他合适的地方解除注册

EventBus.getDefault().unregister(this);

以上就是全部的使用方法,有没有很简单,有没有很清晰,有没有很明了,有没有很赞。

高级使用方法

关于onEvent()接收事件的方法,它是在主线程接收的事件,还是在子线程中接收的事件,或者是哪一条子线程接收的事件?EventBus提供了4类接收事件的方法可以满足你的个(bian)性(tai)需求。
onEvent():如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread():如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground():如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync():使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

其他

有这么一个疑问,假如我的工程里用EventBus发布了很多事件,同时又有很多地方要分别接收这些事件,那么发出的消息和接收的消息是怎么对应的,会不会接收错了?前面已经说过了,被观察者和观察者事先通过约定好的信号找到彼此,EventBus怎么知道要调哪个函数呢,就看哪个函数传进去的参数是这个类的实例,哪个是就调哪个。那如果有两个是呢,那两个都会被调用。我上面的例子里事件是一个空类,而实际使用过程中可以加各种类型的参数来实现数据的传递,有没有很炫酷。

总结

Android中通信的解决方案有很多,具体方案还要根据实际情况来制定。对于新开发者来说最好还是先用用用Handler,startActivityforResult,onNewIntent,Broadcast,Callback的方案体验下Android开发的魅力,EventBus可以作为杀手锏,当其他方案都很不好解决的时候,再亮出来不迟。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,098评论 25 707
  • 一、概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handl...
    AiPuff阅读 1,277评论 2 0
  • 先吐槽一下博客园的MarkDown编辑器,推出的时候还很高兴博客园支持MarkDown了,试用了下发现支持不完善就...
    Ten_Minutes阅读 562评论 0 2
  • #玩卡不卡·每日一抽# 每一位都可以通过这张卡片觉察自己: 1、直觉他叫什么名字?小美 2、他几岁了? 16 3、...
    燕燕584阅读 164评论 0 0
  • 6月20日 星期二 小雨转阴 今天儿子放学回家,吃完饭主动去写作业,刚写完作业,他小姨打电话说不小...
    一年级八班崔皓媛阅读 212评论 0 0