之前学习了Rxjava(RxJava学习笔记),但是一直找不到使用它的地方。最近做项目的时候遇到需要使用eventbus的时候,突然想起来Rxjava的一个拓展面就是Rxbus,果断用来试试

下一篇博文:RxJava实现原理探索

什么是Eventbus

EventBus定义:是一个发布 / 订阅的事件总线。
这么说应该包含4个成分:发布者,订阅者,事件,总线。
那么这四者的关系是什么呢?
很明显:订阅者订阅事件到总线,发送者发布事件。

总结一下就是:我订阅你,你遇到事情了,发送事件,或者理解为更新动态,我就收到消息。

常用的地方

Eventbus和Rxbus常用于组件间信息的交换与通知,避免采用广播以及使用一大堆接口来实现。

使用的地方以本次项目来举例:
一个商城界面,包含一个RecyclerView和LinearLayout,LinearLayout中是一个购物篮信息,也就是美团那种。当点击RecyclerView中的按钮时,商品被添加,LinearLayout中的商品总价应该发生变化。而这时候就到了使用Eventbus或者Rxbus的时候了。
为了增加商品总价,常见的方法有这几种:
1. 在创建adapter的时候将LinearLayout的对象一并传入,以此可以更改LinearLayout中的TextView
2. 设置广播事件。添加商品-》发送广播-》处理广播
3. 设置接口。添加商品-》触发接口
4. 使用观察者模式。也就是Eventbus以及Rxbus实现的功能。

上面的四种方式,第一种差评,可以直接排除。第二种和第三种倒是可以,但是这种事件多了之后就会产生一大堆接口,维护起来很麻烦。
因此,在这里就可以使用Eventbus或者Rxbus了。
而Rxjava相对于Eventbus来说更加的好用,因为它不止这个功能,还可以避免compile一大堆其余的依赖

使用Rxjava实现Rxbus代替eventbus

package com.screform.mmd.utils;import android.os.Bundle;import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;/*** RxBus* Created by lizhongquan on 16-1-20.*/
public class RxBus {private final Subject<Object, Object>rxBus = new SerializedSubject<>(PublishSubject.create());private RxBus() {}public static RxBus getInstance() {return RxbusHolder.instance;}public static class RxbusHolder{private static final RxBus instance = new RxBus();}public void send(Bundle o) {rxBus.onNext(o);}public Observable<Object> toObserverable() {return rxBus;}
}

使用
在被订阅的地方

// 利用bundle传值
Bundle bundle = new Bundle();
bundle.putString("eventname", "addOrderInfoGoods");
RxBus.getInstance().send(bundle);

订阅者
首先使用map进行类型转换,将Object类型转换为Bundle类型
之后在onNext中进行处理(这里使用一个参的new Action1替换)

   /*** RxBus*/private void operateBus() {RxBus.getInstance().toObserverable().map(new Func1<Object, Bundle>() {@Overridepublic Bundle call(Object o) {return (Bundle) o;}}).subscribe(new Action1<Bundle>() {@Overridepublic void call(Bundle bundle) {if (bundle.getString("eventname").equals("showLinearLayoutBuyOK")) {showLinearLayoutBuyOK(bundle);}}});

这样的话就完成了整个订阅与处理事件。
另外,一旦订阅者订阅了某个事件,就一定要记得取消订阅,不然会造成内存泄露。一般是在onStop或者是onPause中。

取消订阅

可以利用Subscription rxsub = Rxbus.getInstance()……….
在onStop或者是onPause中使用rxsub.unsubscribe()方法就可以取消了
而这个rxsub至于是生成一个全局的还是通过其他的方式来获取或者是取消就可以根据自己的需要来设置了,一定要注意避免内存泄露,对于手机内存小的积累一下很容易就OOM了


可添加的功能

还有一个就是关于订阅事件的分发问题,现在是利用Bundle来传递事件名,其实这样不好,因为这样的话所有的订阅者都会收到通知。可以在Rxbus中添加一个过滤器,这样就可以让指定订阅者收到。最近由于事情太多,以后有需要的时候再更新吧

RxJava使用示例: 实现Rxbus代替eventbus相关推荐

  1. RxJava学习(四利用RxJava打造自己的RxBus)

    前面说过Rxjava的功能很强大,不仅仅是实现链式的异步操作,它的功能很强大还可以通过RxBus实现EventBus的消息/事件传递功 能,我们来看看 RxBus 1 package com.exam ...

  2. Rxjava——使用RxBus替换EventBus

    如果你的项目中用到了Rxjava,那么你就完全可以自己去写一个RxBus来替换EventBus,让项目的体积变小. 在网上看了很多人写的RxBus,总感觉有些缺陷或者不能完全替换EventBus的功能 ...

  3. RxJava实现事件总线——RxBus

    事件总线的好处在于方便组件之间的交互,RxBus不是一个库,而是使用RxJava实现事件总线的一种思想.首先介绍一下RxJava与事件总线的不同之处. RxJava使用的是Observable-Obs ...

  4. RxBus对比EventBus

    本文通过原理分析和实测结果对EventBus和RxBus做详尽的对比,给大家在实际项目中选型做参考. 开始之前先提一下Otto:https://github.com/square/otto 当初And ...

  5. 【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )

    文章目录 一.导入依赖 二.注册 EventBus 三.发送 EventBus 事件 四.完整代码示例 五.源码地址 一.导入依赖 在 Module 下的 build.gradle 中导入 Event ...

  6. EventBus、Rxjava、RxBus的定义、作用、使用方式及区别

    这篇文章是在读了别人的文章的基础上并结合工作中项目做的总结,总共分为以下几个部分,这只是简单总结,想了解更多原理的可以点击后面的相关链接: 1.什么是Evenbus?有什么用?怎么用? 2.什么是Rx ...

  7. Java高阶编程——RxBus 开源,基于 RxJava 的 event bus

    介绍 RxBus 是一个发布/订阅模式的事件总线,用法和 EventBus 一样简单.RxBus 基于 RxJava 开发,除了拥有和 EventBus 一样简单的事件总线机制之外,还拥有 RxJav ...

  8. RxJava API使用示例

    概述 RxJava API示例代码,可离线查看rxjava1.0大部分API的marble图,描述,示例代码,并支持示例代码实时输出及展示执行结果. 详细 代码下载:http://www.demoda ...

  9. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

最新文章

  1. .php y=mp4,PHP输出MP4视频流函数
  2. linxu /proc/stat 文件
  3. 给MM修电脑的三个步骤
  4. ubuntu 卸载NetworkManager
  5. 二分图最大权匹配:Kuhn-Munkres算法
  6. 计算机信息安全技术 学习笔记
  7. http文件服务器(Ubuntu)
  8. Pytorch 分布式训练中DP和DDP的原理和用法
  9. 记录:FC-SAN与IP-SAN比较
  10. iOS13.7 各机型续航对比测试,更省电了吗?
  11. Python基础——csv文件中某列数据替换为数字
  12. 1587 例题3 [SCOI2009] Windy 数(Bzoj1026 LOJ LUOGU2657 提高+/省选-) 需考虑前导0的数位DP
  13. 【转】Photoshop保存格式介绍大全
  14. iFunk S游戏本,定义机械键盘
  15. Java面向对象设计模式
  16. 【大学四年】我的大学生活回顾
  17. 【并行计算】Slurm的学习笔记
  18. Vue项目优化,减小打包体积
  19. php获取文件夹中的音乐文件_PHP获取音频文件信息的方法
  20. 2019阿里校招测评题,光明小学完全图最短路径问题

热门文章

  1. python基础——函数
  2. 霍尼韦尔推出电池储能系统平台
  3. 模仿3d打印中使用 Arduino 来根据 NTC 温度传感器的查询表来测量温度的示例程序。
  4. typeAliases和package标签的用法
  5. 计算飞机票价格python_完美假期第一步:用Python寻找最便宜的航班!
  6. 异形工厂自动化工厂教程
  7. Python中文件的操作
  8. linux下的c 编程入门教程,Linux下的C编程入门教程.ppt
  9. 力扣数组算法(c++)(代码随想录数组部分)
  10. java每个类都定义构造方法吗,Java中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。()...