Photo by Peter Hershey on Unsplash
學(xué)習(xí)于:http://www.reibang.com/p/ca090f6e2fe2
http://reactivex.io/documentation/subject.html
基于RxJava2,通過觀察者模式實(shí)現(xiàn)頁(yè)面之間的數(shù)據(jù)傳遞器瘪;
public class RxBus {
private static volatile RxBus mInstance;
private final Subject<Object> bus;
public RxBus() {
bus = PublishSubject.create().toSerialized();
}
// 單例RxBus
public static RxBus getDefault() {
if (mInstance == null) {
synchronized (RxBus.class) {
if (mInstance == null) {
mInstance = new RxBus();
}
}
}
return mInstance;
}
// 發(fā)送事件
public void post(Object o) {
bus.onNext(o);
}
public <T> Observable<T> toObservable(Class<T> eventType) {
return bus.ofType(eventType);
}
}
Subject:既作為Observer又作為Observable铸本,并且提供了4種Subject
,
此處我們僅僅是簡(jiǎn)單的實(shí)現(xiàn)RxBus,所以使用PublishSubject
;
PublishSubject
發(fā)送訂閱之后的全部數(shù)據(jù);
相同的是如果源Observable以錯(cuò)誤終止不铆,Subject
則不會(huì)向隨后的觀察者發(fā)出任何項(xiàng)目,但會(huì)將簡(jiǎn)單地傳遞源Observable中的錯(cuò)誤通知裹唆。
Subject
是非線程安全的,為了在并發(fā)情況下只一個(gè)線程調(diào)用onNext()
等方法只洒,所以通過toSerialized()
方法將Subject
對(duì)象轉(zhuǎn)換為SerializedSubject
對(duì)象许帐;
發(fā)送事件
public void btn_2(View view) {
RxBus.getDefault().post(new RxBusPostBean("whstywh", "18"));
}
事件類
public class RxBusPostBean {
private String name;
private String age;
public RxBusPostBean(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
接受事件
private void getDataByRxBus() {
mDisposable = RxBus.getDefault()
.toObservable(RxBusPostBean.class)
.subscribe(new Consumer<RxBusPostBean>() {
@Override
public void accept(RxBusPostBean rxBusPostBean) throws Exception {
mTextView1.setText(rxBusPostBean.getName());
mTextView2.setText(rxBusPostBean.getAge());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d("flag", "throwable:" + throwable.getMessage());
}
});
}
在生命周期結(jié)束的地方取消訂閱事件,防止RxJava可能會(huì)引起的內(nèi)存泄漏問題
@Override
public void onDestroy() {
super.onDestroy();
if (!mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
對(duì)于RxJava的學(xué)習(xí)才剛剛開始毕谴!
RxJava:RxBus事件總線
RxJava:RxBinding
RxJava:Rxlifecycle