博客: 安卓之家

微博: 追风917

CSDN: 蒋朋的家

简书: 追风917

EventBus3 简介


EventBus Android 发布/订阅事件总线,可简化 Activities, Fragments, Threads, Services 等组件间的消息传递,可替代 Intent, Handler, BroadCast ,接口等传统方案,更快,代码更小,50K 左右的 jar 包,代码更优雅,彻底解耦。EventBus3 是最新版本,官网地址:

https://github.com/greenrobot/EventBus

使用


这里简单介绍下使用方法:

1 添加依赖 compile 'org.greenrobot:eventbus:3.0.0'

2 编写事件类

3 post 发布事件

这里有直接发布和滞留发布

//直接发布
EventBus.getDefault().post("直接发布");
//滞留发布
EventBus.getDefault().postSticky("滞留发布");

注意可以发布的是一个 Object 类,发送什么,订阅者就会接收什么。

此处要注意两个地方:

  1. 如果 post 字节数据,此时订阅者的方法里参数需为 Byte,而不是 byte,同样的,post int数据,订阅方法参数需为 Interger,其他基本数据类型同理

  2. 如果 post 字符串,那么所有方法的参数是 String 类型的订阅者都会接收到事件而执行方法。

4 订阅者接收事件

订阅的时候要注册和取消注册。

注册一般是在 onCreateonStart 里注册,尽量不要在 onResume,可能出现多次注册的情况,比如下面这个异常::

EventBusException: Subscriber class already registered to event class

可以先判断下:

    if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}

参看这里:GreenRobot EventBusException: Subscriber class already registered to event class

取消注册 要写到 onDestroy 方法里,不要写到 onStop 里,有时会出现异常的哦

EventBus 3 和之前版本的 EventBus 不兼容,这里采用注解的方法来接收事件,四种注解 @Subscrible@Subscrible(threadMode = ThreadMode.ASYNC)@Subscribe(threadMode = ThreadMode.BACKGROUND)@Subscribe(threadMode = ThreadMode.MAIN) 分别对应之前的 onEvent()onEventAsync()onEventBackground()onEventMainThread()

EventBus 3 采用注解后,方法名没有限制了,参数只有一个,和发送者 post 的参数对应配对,在未声明 threadMode 时,默认的线程模式为 ThreadMode.POSTING,只有在该模式下才可以取消线程,否则容易导致如下异常:

org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread

由于可在任何地方都可以 post 一个事件,那么在不同线程之间传递事件,比如在工作线程传递一个事件更新UI线程中的一个控件,则需要注意 threadMode 的切换。

好了,基本使用大概就这些,后面遇到会补充...

2016.07.13补充:

今天遇到了订阅事件无法执行的情况,分析后发现是订阅事件的 Activity 还未执行的原因。

找到原因就好办了,这时候就需要用到 postSticky

发布事件时用 postSticky 操作:

EventBus.getDefault().postSticky(event);

订阅时,添加 sticky = true

@Subscribe(sticky = true)    //看下 `@Subscribe` 源码知道 `sticky` 默认是 `false`
public void onEvent(Event e) {
---
}

这里也有个坑,就是 EventBus.getDefault().register(this); 注册时最好放到各变量初始化最后,否则可能会出现一些变量空指针异常。

混淆


没什么说的,复制下面代码到你的混淆文件即可:

-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode {
*;
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}

发布的事件多了以后,我们很难去管理,下面推荐个 AS 插件:

https://github.com/kgmyshin/eventbus3-intellij-plugin

更多 AS 插件请访问:https://github.com/jp1017/AndroidStudioPlugins

欲知更多 EventBus 的内容,还可参考:

EventBus3新特性及用法

EventBus 源码解析

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

最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

神奇的安卓开发网站:http://androidcat.com/

安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐_

欢迎交流,转载请注明出处,谢谢!

EventBus3 简单使用及注意点的更多相关文章

  1. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...

  2. EventBus3.0源码解析

    本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...

  3. Android -- 从源码带你从EventBus2.0飚到EventBus3.0(一)

    1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...

  4. Android -- 从源码带你从EventBus2.0飚到EventBus3.0

    1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...

  5. Android事件总线(一)EventBus3.0用法全解析

    前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...

  6. android EventBus的简单使用

    今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...

  7. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  8. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  9. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. 三种asp.net 抓取网页源代码

    /// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...

  2. 【转】eclipse android 设置及修改生成apk的签名文件 -- custom debug keystore

    原文网址:http://hold-on.iteye.com/blog/2064642 android eclipse 设置及修改生成apk的签名文件 1. 问题: 平时在使用eclipse进行andr ...

  3. Flume FileChannel优化(扩展)实践指南

    本文系微博运维数据平台(DIP)在Flume方面的优化扩展经验总结,在使用Flume FileChannel的场景下将吞吐率由10M/s~20M/s提升至80M/s~90M/s,分为四个部分进行介绍: ...

  4. 第一章 用three.js创建你的第一个3D场景

    第一章 用three.js创建你的第一个3D场景 到官网下载three.js的源码和示例. 创建HTML框架界面 第一个示例的代码如下: 01-basic-skeleton.html 位于 Learn ...

  5. android学习——activity的生命周期

    Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...

  6. 转载--C++中struct与class

    转自:http://www.cnblogs.com/york-hust/archive/2012/05/29/2524658.html 1. C++中的struct对C中的struct进行了扩充,它已 ...

  7. MVC 依赖注入/控制反转

    http://www.cnblogs.com/cnmaxu/archive/2010/10/12/1848735.html http://www.cnblogs.com/artech/archive/ ...

  8. 稀疏矩阵coo_matrix的乘法

    稀疏矩阵的乘法在做基于n-gram的分类的时候还是相当有用的,但是由于网上资料太少,所以折腾了几天才算折腾出来. 首先scipy包里常见的稀疏矩阵有三种形式, coo_matrix, csr_matr ...

  9. ASP.NET多线程下使用HttpContext.Current为null解决方案

    多线程或者异步调用中如何访问HttpContext? 前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢? 答案有二种:1. 在 ...

  10. leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法

    Maximum Subarray  Find the contiguous subarray within an array (containing at least one number) whic ...