Photo by Peter Hershey on Unsplash
學習于:http://www.lxweimin.com/p/ca090f6e2fe2
http://reactivex.io/documentation/subject.html
基于RxJava2,通過觀察者模式實現頁面之間的數據傳遞;
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;
}
// 發送事件
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
,
此處我們僅僅是簡單的實現RxBus,所以使用PublishSubject
;
PublishSubject
發送訂閱之后的全部數據;
相同的是如果源Observable以錯誤終止,Subject
則不會向隨后的觀察者發出任何項目,但會將簡單地傳遞源Observable中的錯誤通知。
Subject
是非線程安全的,為了在并發情況下只一個線程調用onNext()
等方法,所以通過toSerialized()
方法將Subject
對象轉換為SerializedSubject
對象;
發送事件
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());
}
});
}
在生命周期結束的地方取消訂閱事件,防止RxJava可能會引起的內存泄漏問題
@Override
public void onDestroy() {
super.onDestroy();
if (!mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
對于RxJava的學習才剛剛開始!
RxJava:RxBus事件總線
RxJava:RxBinding
RxJava:Rxlifecycle