RxJava实现事件总线(RxBus)学习笔记

  • 目录

    • 事件总线的介绍
    • 利用RxJava实现事件总线(Rxbus)
    • Rxbus的使用

  • 事件总线的介绍

1. 什么是事件总线?

事件总线就是一条通信用的通道,上面跑着各种信息,Android中的各个组件或是控件都可以向它发送各种信息,在各个组件或控件中只要订阅这条总线,每当总线收到消息的时候,这些订阅者同样就能收到这些消息。

2. 我不想要所有的消息,我只想要其中的一些消息,怎么办?

做法很简单,只要添加一个过滤器,过滤掉那些不要的消息就OK了。

3. 图解事件总线
图解事件总线

  • 利用RxJava实现事件总线

1. 前言

感谢作者YoKey这篇文章,接下来的代码大多参考他的写发,各位读者可以直接通过链接去读他的这篇文章,读完可以直接跳过本章。

2. 实现

这里直接使用YoKey大神的代码了(本人能力有限,写不出比他更好的代码):

/*** RxBus
*Created by YoKeyword on 2015/6/17.
*/
public class RxBus {
private static volatile RxBus defaultInstance;
// 主题
private final Subject bus;
// PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 单例RxBus
public static RxBus getDefault() {
RxBus rxBus = defaultInstance;
if (defaultInstance == null) {
synchronized (RxBus.class) {
rxBus = defaultInstance;
if (defaultInstance == null) {
rxBus = new RxBus(); defaultInstance = rxBus;
}
}
}
return rxBus;
}
// 提供了一个新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable (Class<T> eventType) {
return bus.ofType(eventType);
}
}


**********
  * ######简单介绍

上面代码中有一个被命名为bus的Subject:

private final Subject bus;

它是整个总线的核心,也可以理解为它就是这条总线。
然后还有一个向这条总线发消息的方法:

// 提供了一个新的事件
public void post (Object o) {
bus.onNext(o);
}

当然也有一个订阅这条总线的方法(注意这是一个泛型方法,这意味着什么呢?这就意味着,这个订阅总线的方法自带过滤器,订阅之后,你只会接收到你传入参数的这种类型。):

// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable (Class<T> eventType) {
return bus.ofType(eventType);
}


************

* ### Rxbus的使用

通过一个简单的demo来演示一下Rxbus的简单使用
###### 1. demo功能简介
这是一个展示通过Rxbus实现fragment和Activity通信的demo,界面草图如下:
![demo草图.png](http://upload-images.jianshu.io/upload_images/2276275-69599b56bba7e302.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
整个长方形是一整个Activity,长方形中的黄色部分是fragment,activity中有一个TextView,用来展示从fragment传递过来的消息,fragment中有两个按钮,buttont 01和buttont 02(请忽略掉button拼写错误,英语不好),点击button 01 和button 02的时候分别会发送两条类型形同,内容不同的数据给Activity,然后Activity在将接收到的消息中的内容展示在TextView上。

###### 2. 消息类型的定义
消息的类型定义十分简单,如下:

package me.zjc.rxbustest;
/**
*Created by ChuanZhangjiang on 2016/6/19.
*
*/
public class Event {

     private String content;  

     public Event(String content) {        
       this.content = content;    
     }    

     public String getContent() {        
         return content;    
      }    

     public void setContent(String content) {        
        this.content = content;    
     }

}

######3. 在fragment中发送发送消息:

mView.findViewById(R.id.btn_button01).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Rxbus.getDefaultInstance().post(new Event("btn 01 is click"));
}
});

mView.findViewById(R.id.btn_button02).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Rxbus.getDefaultInstance().post(new Event("btn 02 is click"));
}
});

######4. 在Activity中接收消息

subscription = Rxbus.getDefaultInstance().toObservable(Event.class)
.subscribe(new Action1<Event>() {
@Override
public void call(Event event) {
tv.setText(event.getContent());
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});

######5. 解除订阅
然后别忘了在activity中的ondestroy方法中取消订阅,像这样(不然activity就泄漏咯):

if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
}


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,454评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 3,163评论 0 6
  • 大家好,我叫石头 前言 事件总线出现的原因:为了使组件之间的通信变得简单,深度解耦!说白了就是切断组件之间的直接联...
    噬魂Miss阅读 1,377评论 4 3
  • 国庆放假的时候,决定不回去。。看到这样的黄昏突然就有点想念家乡山中的黄昏,所以,用手机定格了这一时刻。。 最后两张...
    山隐结发阅读 204评论 0 1