#RxBus
16:04 2017-04-17
导包:
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
1.代码:
1.第一种:
public class RxBus {
private static volatile RxBus defaultInstance;
private final Subject<Object, Object> bus;
// PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 单例RxBus
public static RxBus getDefault() {
if (defaultInstance == null) {
synchronized (RxBus.class) {
if (defaultInstance == null) {
defaultInstance = new RxBus();
}
}
}
return defaultInstance ;
}
// 发送一个新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObservable (Class<T> eventType) {
return bus.ofType(eventType);
}
}
2.第二种:
public class RxBUS1 {
private final Subject<Object, Object> mSubjectBus;
public RxBUS1() {
mSubjectBus = new SerializedSubject<>(PublishSubject.create());
}
private static class SingletonFactory {
private static volatile RxBUS1 mDefaultRxEventBus = new RxBUS1();
}
public static RxBUS1 getDefault() {
return SingletonFactory.mDefaultRxEventBus;
}
public void postEvent(Object event) {
mSubjectBus.onNext(event);
}
public Observable<Object> onReceiveEvent() {
return mSubjectBus;
}
}
2.使用:
发送:
RxBUS.getInstance().send(T);
RxBUS1.getInstance().send(T);
接收:
第一种RxBUS使用方法
Subscription rxSubscription = RxBus.getDefault().toObserverable(T)
.subscribe(new Action1<T>() {
@Override
public void call(T) {
...
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// TODO: 处理异常
}
});
第二种RxBUS1使用方法
Subscription subscribe = RxBUS1.getDefault().onReceiveEvent().subscribe(new Action1<T>() {
@Override
public void call(T) {
...
}
});
注意:页面销毁时取消订阅,防止内存溢出:
subscribe.unsubscribe();
可以在BaseActivity或者BaseFragment中:
创建:List rxBusList = new ArrayList<>();
创建RxBus后使用:rxBusList.add();
在base的destory时,遍历集合取消订阅:
@Override
protected void onDestroy() {
super.onDestroy();
for (Subscription subscription : rxBusList) {
if (subscription!=null&&!subscription.isUnsubscribed()){
subscription.unsubscribe();
}
}
}