基于RxJava实现的RxBus可替换原有的EventBus
关于RxJava的相关知识推荐
我所理解的RxJava——上手其实很简单(一)
我所理解的RxJava——上手其实很简单(二)
我所理解的RxJava——上手其实很简单(三)
这位作者写的还是比较容易理解的
package com.xc.todaynews.rxjava;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
public class RxBus {
private static RxBus mRxBus = null;
/**
* PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
*/
private Subject<Object, Object> mRxBusObserverable = new SerializedSubject<>(PublishSubject.create());
public static synchronized RxBus getInstance() {
if (mRxBus == null) {
mRxBus = new RxBus();
}
return mRxBus;
}
public void post(Object o) {
if (hasObservers())
mRxBusObserverable.onNext(o);
}
public Observable<Object> toObserverable() {
return mRxBusObserverable;
}
/**
* 判断是否有订阅者
*/
public boolean hasObservers() {
return mRxBusObserverable.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() {
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RxBus.getInstance().post(HandleEvent.getInstance());
}
});
}
public void addSubscription(Subscription subscription) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
this.mCompositeSubscription.add(subscription);
}
private void rxBusObservers() {
Subscription subscription = RxBus.getInstance()
.toObserverable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object event) {
if (event instanceof HandleEvent) {
//do something
}
}
});
addSubscription(subscription);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("xc", "onDestroy");
if (this.mCompositeSubscription != null) {
//取消注册,以避免内存泄露
this.mCompositeSubscription.unsubscribe();
}
}
}