本期blog作为EventBus(以下简称EB)学习的始动篇,主要记载了EB的功能、优点、使用方法,内容基于github上的README.mdHOWTO.md

何为EventBus

  EB实现了Android上的一种事件分发/接收总线机制,其优点可以概括为以下三条:

  1. 简洁:将事件分发者与接收者解耦,代码简单清晰;
  2. 快速:使用了反射,而不是在Android上效率低下的注解方式进行实现
  3. 轻量级:jar <50k

EventBus的使用方法

  将EventBus引入到项目中(gradle)  

compile 'de.greenrobot:eventbus:2.4.0'

  分发事件

eventBus.post(anyEvent);

  接收事件

eventBus.register(this);
public void onEvent(AnyEvent e) {/* do something */};

  以上就是非常简单的EventBus使用方法,下面是部分进阶内容:)

EB中不同的线程模式/ThreadMode

  在实际开发中,往往需要根据需求的不同(是UI变化还是网络请求等),在不同的线程中进行逻辑处理。EB通过在接收者中使用不同的方法命名,为我们提供了简便的处理方法,无须深入到复杂的线程内部。

  • PostThread: 默认的调用方式,在同一线程中启动。如无特别需求,皆应采取此方式。
  • MainThread: 在主线程(UI线程)中启动,应避免长时间操作阻塞主线程(ANR)。
  • BackgroundThread: EB使用固有的后台线程进行处理,也应当避免长时间操作造成阻塞。
  • Async: 异步处理,在主线程与后台线程之外启动新的线程,长时间操作应当用此模式。EB内建了线程池用于复用。

  在接收者中以方法名onEventXXX来使用不同的线程模式。

定制Custom EB

  通常简便的获取EventBus实例是通过 EventBus.getDefault() 来获取单例,当需要对其进行定制时,可以通过EventBusBuilder进行。

EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 当没有对应接收者时,不发送消息

  更多的用法可以参阅javadoc

定制Default EB

  如果想对默认的EB单例进行定制,需要在初次调用EventBus.getDefault()之前进行,通常建议放在Application类中。

EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();

终止Event分发

  在onEvent中通过eventBus.cancelEventDelivery(event)可以终止该Event的继续分发

接收者优先级

  具有更大优先级的接收者,会优先处理信息,可以搭配上一条(终止Event分发)使用。

int priority = 1;
EventBus.getDefault().register(this, priority);

Sticky Events

  不知道怎样恰当翻译(粘性事件?)。EB内建了一个微型的缓存机制,可以保存最近一次以Sticky形式发送的Event,当接收者(须生命为Sticky)注册的时间晚于最近一个StickyEvent时,仍然可以接收到该Event。

  发送StickyEvent

EventBus.getDefault().postSticky(someEvent);

  接收StickyEvent

@Override
public void onStart() {
super.onStart();
EventBus.getDefault().registerSticky(this);
} public void onEvent(SomeEvent e) {
/* do something */
} @Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}

  获取上一个StickyEvent

EventBus.getDefault().getStickyEvent(Class<?> eomeEventType);

ProGuard配置

  因为ProGuard会对方法名进行混淆,而EB是基于反射完成的,故需要在ProGuard文件(proguard.cfg)中配置特殊规则

-keepclassmembers class ** {
public void onEvent*(**);
} # Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}

AsyncExcutor

  非核心功能,暂且略过不表。

[EventBus源码解析] 初探EventBus的更多相关文章

  1. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  2. 【Android】EventBus 源码解析

    EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...

  3. Android EventBus源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  4. andorid jar/库源码解析之EventBus

    目录:andorid jar/库源码解析 EventBus: 作用: 用于不同Activity,Service等之间传递消息(数据). 栗子: A页面:onCreate定义   EventBus.ge ...

  5. Guava源码解析之EventBus

    最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执 ...

  6. Android EventBus源码解析

    项目地址 :https://github.com/greenrobot/EventBus 这个项目个人感觉就是为了解决回调事件过多的,比方说A函数在做完以后 要调用b类的c函数,那我们通常的做法就是 ...

  7. EventBus源码解析

    用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...

  8. [EventBus源码解析] 订阅者处理消息的四种ThreadMode

    前言 在前面,我们探讨了如何在自己的代码中引入EventBus,进行基本的事件分发/监听:对注册观察者与事件发送的过程进行了浅析.从之前的学习中,我们了解到,EventBus一共有4种onEvent方 ...

  9. 76.Android之EventBus源码解析

    转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Andro ...

随机推荐

  1. 优雅的处理Android数据库升级的问题

    原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest ...

  2. Rhel6-torque作业调度系统配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.121 server21.example.com 计算节点 192.1 ...

  3. 2016 - 1 - 23 xml解析 -- 语法简介

    一: XML的概念 1. 一种可拓展标记语言 2. 与json一样,也是一种常用的数据交互格式 3. 一般也叫XML文档---XML Document 二: XML语法   1.一个完整的XML文档一 ...

  4. 如何编译spring源码,并导入到eclipse中

    wsc@WSC-PC /d/wsc/study-spring-source$ git clone https://github.com/spring-projects/spring-framework ...

  5. Java网络应用编程

    1,网络连接 (1)用户向服务器发送请求(Socket); (2)服务器向用户发送信息(ServerSocket),一直监听的话用.accept(); 2,信息发送与接收 (1)客户向服务器端发送信息 ...

  6. Struts 2开讲了!!!

    首先我们要知道我们为什么要学习Struts2这门技术? Struts2是java程序员所必需学习的一门技术几乎面试都会提起! Struts英文单词是什么意思,怎么理解? 翻译:支柱,支杆,来源于建筑和 ...

  7. 浅谈SEO-收录(二)

    如何更好的让搜索引擎收录网站中的内容,想要被良好的收录,可以尝试一下几点: 一.机器可读 百度通过一个叫做Baiduspider的程序抓取互联网上的网页, 经过处理后建入索引中,目前只支持读文本,fl ...

  8. XML Schema的基本语法(转)

    XML Schema的基本语法(转) XSDL(XML Schema定义语言)由元素.属性.命名空间和XML文档种的其他节点构成的. 一.XSD中的元素 XSD文档至少要包含:schema根元素和XM ...

  9. 一种Go使用tcp检测超时的方式

    c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, ...

  10. CCLabel在最大宽度已知的情况下如何获取实际宽高

    当前环境在cocos2.2.6, 在UI摆图中,会遇到一种情况就是 设定了label的最大宽度MAX_WIDTH,但label的内容是动态的,如何在label输入了文字之后获取label的真实宽高? ...