文档章节

EventBus 3.0的用法详解(一)

hejunbinlan
 hejunbinlan
发布于 2016/03/01 15:02
字数 1112
阅读 91
收藏 0
点赞 1
评论 0

这是一个系列,如果你还没有看之前的文章:

EventBus 3.0的用法详解(二)

看到大家提出的关于Android的问题,有一部分可以用EventBus解决,而也有相当多的人推荐使用EventsBus,因为其和GreenDAO出自一家公司,并且使用它非常的简单,所以现在很多的互联网app都会使用EventsBus来进行消息传递。

基于此,有很多EventBus的文章,写的非常的好,但是由于EventBus已经出了3.0版本,而国内的大多数翻译只是停留在了2.4版本左右,对于那些刚刚接触EventBus的人,从最新版接触学习,是最理想的学习路线。

所以,在这儿,我总结下EventBus3.0的用法。

什么是EventBus

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

EventBus框架

大家谈到EventBus,总会想到greenrobot的EventBus,但是实际上EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多。用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方便,但是限定了方法名,不支持注解。另一个库square/otto修改自 Guava ,用的人也不少。

这篇博文暂时只讨论greenrobot的EventBus库。

基本用法

很多文章会讲到Subscriber,以及Publisher和ThreadMode等概念,我觉得暂时没有必要,简单粗暴,直接上代码:

添加依赖库:

首先你要为你的app添加依赖库:

compile 'de.greenrobot:eventbus:3.0.0-beta1'

关于如何添加依赖库,请参考Gradle for Android 第三篇( 依赖管理 )

有些人会问为什么是beta版本,因为eventbus现阶段3.0版本只处于beta测试阶段。有些人会问如何找到eventbus 3.0.0版本,具体添加:

注册

举个例子,你需要在一个activity中注册eventbus事件,然后定义接收方法,这和Android的广播机制很像,你需要首先注册广播,然后需要编写内部类,实现接收广播,然后操作UI,在EventBus中,你同样需要这么做。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

} @Override protected void onDestroy() { super.onDestroy();
    EventBus.getDefault().unregister(this);
}

订阅者

类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了(看不懂没关系):

@Subscribe(threadMode = ThreadMode.MainThread) public void helloEventBus(String message){
    mText.setText(message);
}

该操作很简单,定义了一个hello方法,需要传入String参数,在其中操作UI操作,注意:
我们添加了注解@Subscribe,其含义为订阅者,在其内传入了threadMode,我们定义为ThreadMode.MainThread,其含义为该方法在UI线程完成,这样你就不要担心抛出异常啦。是不是很简单?

发布者

既然你在某个地方订阅了内容,当然就会在某个地方发布消息。举个例子,你的这个activity需要http请求,而http请求你肯定是在异步线程中操作,其返回结果后,你可以这么写:

String json="";
EventBus.getDefault().post(json);

这样就OK了,你可以试下能否正常运行了!

原理初探

你订阅了内容,所以你需要在该类注册EventBus,而你订阅的方法需要传入String,即你的接收信息为String类型,那么在post的时候,你post出去的也应该是String类型,其才会接收到消息。

如果你post的是对象

首先你需要定义一个类似pojo类:

public class MessageEvent { public final String name; public final String password; public MessageEvent(String name,String password) { this.name = name; this.password=password;
  }
}

然后你post的时候:

EventBus.getDefault().post(new MessageEvent("hello","world"));

当然,你接收的方法也需要改为:

@Subscribe(threadMode = ThreadMode.MainThread) public void helloEventBus(MessageEvent message){
    mText.setText(message.name);
}

疑问,当你post了消息之后,你的订阅者有多个,每一个都接收吗?能否做到指定接收者。

下一章,带来源码解析以及EventBus的高级用法;
如果大家有兴趣,也可带领大家编写属于自己的EventBus框架,敬请期待。

© 著作权归作者所有

共有 人打赏支持
hejunbinlan
粉丝 40
博文 532
码字总数 21018
作品 0
浦东
高级程序员
gis-luq/RuntimeViewer

RuntimeViewer —— 基于ArcGIS Runtime 100.x开发的移动应用程序框架 组件式开发框架,兼容手机、平板多种设备。 平板模式 手机模式 使用说明 项目采用插件化结构设计,文件夹架构说明如下 ...

gis-luq ⋅ 05/11 ⋅ 0

Android之撸一个类似EventBus的轮子

用过eventBus的人都知道,在组件及时通讯中,使用非常方便。 一般我们是这样做的:总结为三部曲: 这就是EventBus的强大之处,用过的人都说好,哈哈哈哈!!!! 上图描述吧。有图有真相 Cr...

还有de小星 ⋅ 05/25 ⋅ 0

RxJava实现的EventBus-RxBus

使用RxJava2实现RxBus 当我们使用RxJava2实现EventBus模式时,我们称其为RxBus. 注意:这仅作为一个例子。 那么,就让我们来看看如何使用RxJava2实现RxBus吧 首先,你得了解RxJava中有关sub...

塞上牧羊空许约 ⋅ 05/12 ⋅ 0

【死磕Sharding-jdbc】—–路由&执行

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/09efada2d086 继续以模块中的为基础,剖析分库分表简单查询SQL实现--,即如何执行简单的查询SQL,接下来的分析以执行SQL语句为例...

飞哥-Javaer ⋅ 05/03 ⋅ 0

Android 计步器应用 - healthgo

healthgo a android pedometer app (安卓计步器) Support Android 4.1- 7.0 Thanks Project/People desc other Realm a mobile database 使用了这个数据库 EventBus a publish/subscribe eve......

五十风 ⋅ 04/13 ⋅ 0

阿里ARouter路由实现Android模块化开发

概述 从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大,为了降低大型软件复杂性和耦合度,同时也为了...

code_xzh ⋅ 04/24 ⋅ 0

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

课程目标: 基于 MVP 架构使用Android通用开发框架快速开发微博项目实战 适应人群: 适合大学生和初中级android开发工程师,可以系统化的微博类APP的开发,系统化掌握商业化项目的开发。* 不...

13122542396 ⋅ 05/25 ⋅ 0

Android官方架构组件之LiveData + ViewModel + Room 源码分析一

简单使用案例: MainActivity: MessageViewModel: 其中viewModel.getMessageObserver().observe(this, new Observer() ) 中的this即SupportActivity :LifecycleOwner SupportActivity im......

编程之乐 ⋅ 05/23 ⋅ 0

EventBus 3.0的用法详解(二)

这是一个系列,如果你还没有看之前的文章: EventBus 3.0的用法详解(一) 前一篇文章简单介绍了EventBus 3.0的用法,现在是时候详解其用法了。首先声明,EventBus 3.0的改动针对2.4的改动并不...

hejunbinlan ⋅ 2016/03/01 ⋅ 0

Android 开发者应该知道的 Kotlin 技巧

今年的 Google I/O 大会上,Google 是这样评价 Kotlin:在过去一年里,有35%的专业 Android 开发者在使用 Kotlin,其中95%的开发者都对 Kotlin 非常满意。虽然 Kotlin 正处于发展的初始阶段,...

码云Gitee ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部