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

  • 目录

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

  • 事件总线的介绍

1. 什么是事件总线?

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

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

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

3. 图解事件总线
RxJava实现事件总线(RxBus)学习笔记_第1张图片
图解事件总线

  • 利用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 Observable toObserverable (Class eventType) {
return bus.ofType(eventType);
}
}


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

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

private final Subject bus;

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

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

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

// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public Observable toObserverable (Class 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() {
@Override
public void call(Event event) {
tv.setText(event.getContent());
}
}, new Action1() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});

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

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


本文到此结束。

你可能感兴趣的:(RxJava实现事件总线(RxBus)学习笔记)