-
目录
- 事件总线的介绍
- 利用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();
}
本文到此结束。