项目中加入了RxJava,所有很有必要把Eventbus给替换掉了,引用使用RxBus完全满足了需求了。而且RxBus实现起来超简单只需要几行代码就好了而且同一使用RxJava来取消绑定,我们可以忽视了Eventbus的unregister的过程,当然我们还是需要在界面结束的时候取消Observable间的订阅关系。
直接给我RxBus源码
public class RxBus {
private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());
public void send(Object o) {
_bus.onNext(o);
}
public Observable<Object> toObserverable() {
return _bus;
}
public boolean hasObservers() {
return _bus.hasObservers();
}
}
我们不必要惊呼着几行代码居然就能够实现事件通知呢,因为RxJava的强大他们已经足够满足需求了。我们先声明一个RxBus出来,供事件发送和接收使用:
private RxBus _rxBus = null;
// This is better done with a DI Library like Dagger
public RxBus getRxBusSingleton() {
if (_rxBus == null) {
_rxBus = new RxBus();
}
return _rxBus;
}
发送一条事件:
if (_rxBus.hasObservers()) {
_rxBus.send(new EventObject());
}
接收一条事件:
_subscriptions = new CompositeSubscription();
_subscriptions
.add(_rxBus.toObserverable()
.subscribe(new Action1<Object>() {
@Override
public void call(Object event) {
if (event instanceof EventObject) {
_showTapText();
}
}
}));
取消RxBus订阅关系:
_subscriptions.unsubscribe();
PublishSubject.create()会生成一个只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。然后我们suscribe让这个Observable跟我们在界面定义好的Obsever产生订阅关系:
_rxBus.toObserverable()
.subscribe(new Action1<Object>() {
@Override
public void call(Object event) {
if (event instanceof RxBusDemoFragment.TapEvent) {
_showTapText();
}
}
})
也就是这段代码我们使用Action1来接收事件传递过来从而处理我们想要做的事情即可。
当然我们看这些心里肯定不放心 是不是跟我一样一直不太懂下面这句代码是几个意思且为什么一句话就可以了呢,所以要追根到底。
private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());
首先我们要明白一点Subject是一个既可以当Observable也可以当Observer可以看下这个类的命名方式:
public abstract class Subject<T, R> extends Observable<R> implements Observer<T>
然后我们需要知道SerializedSubject是一个线程安全的Observer并且实现了Subject
public class SerializedSubject<T, R> extends Subject<T, R>
而且PublishSubject也是实现了Subject类
public final class PublishSubject<T> extends Subject<T, T>
知道这些是什么东西之后,我们还没知道他们是怎么挂钩起来的呢。我们知道Subject既可以是Observer也可以说是Observable所以我们提供了一个方法让他作为发射源Observable
public Observable<Object> toObserverable() {
return _bus;
}
这些之后我们就是经典RxJava间的订阅操作了,当我们调用了rxBus中的send(Object o)方法就可以将o这个对象发射到界面相对应的Action1中去,我们就可以接收到传递过来的事件了。