相信大多数开发者都使用过EventBus或者Otto(我还未实践过),作为事件总线通信库,如果你的项目已经加入RxJava和EventBus(或Otto),那不妨用RxBus代替EventBus或者Otto,省去更多库的依赖。
RxJava
之前已经分享过RxJava知识,可以点击RxJava,这里不再细说。
RxBus
假设你已经对RxJava有所了解,再继续往下看。public class RxBus {
private static RxBus mRxBus = null;
/**
* PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
*/
private Subject mRxBusObserverable = new SerializedSubject<>(PublishSubject.create());
public static synchronized RxBus getInstance() {
if (mRxBus == null) {
mRxBus = new RxBus();
}
return mRxBus;
}
public void post(Object o) {
mRxBusObserverable.onNext(o);
}
public Observable toObserverable() {
return mRxBusObserverable;
}
/**
* 判断是否有订阅者
*/
public boolean hasObservers() {
return mRxBusObserverable.hasObservers();
}
}
代码调用
先模拟一个订阅者,用hasObservers判断是否有订阅者,然后再发送。public class RxBusActivity extends AppCompatActivity {
private CompositeSubscription mCompositeSubscription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rx_bus);
rxBusObservers();
rxBusPost();
}
private void rxBusPost() {
Log.d("wxl", "hasObservers=" + RxBus.getInstance().hasObservers());
if (RxBus.getInstance().hasObservers()) {
RxBus.getInstance().post(new TapEvent());
}
}
private void rxBusObservers() {
Subscription subscription = RxBus.getInstance()
.toObserverable()
.subscribe(new Action1() {
@Override
public void call(Object event) {
if (event instanceof TapEvent) {
//do something
Log.d("wxl", "rxBusHandle");
}
}
});
addSubscription(subscription);
}
public void addSubscription(Subscription subscription) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
this.mCompositeSubscription.add(subscription);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (this.mCompositeSubscription != null) {
this.mCompositeSubscription.unsubscribe();//取消注册,以避免内存泄露
}
}
public class TapEvent {
}
}
完整代码
EventBus源码解析
附上大牛们分析的EventBus源码,有兴趣可以看看
EventBus源码研读 by kymjs张涛
EventBus 源码解析 by Trinea
复制代码复制代码