RxBus : 通過RxJava實現(xiàn)Rxbus。
目前大多數(shù)開發(fā)者使用EventBus或者Otto作為事件總線通信庫,對于RxJava使用者來說,RxJava也可以輕松實現(xiàn)事件總線,因為它們都依據(jù)于觀察者模式。
最近正在使用Rxjava,想想使用RxBus來代替EventBus應(yīng)該是不錯的選擇,這樣即可少complie 一個jar。
RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(觀察者)。Observables發(fā)出一系列事件,Subscribers處理這些事件。
- 先分析一個RxBus類
getInstance()首先 這是一個單例模式
SerializedSubject extends Subject extends Observable implements Observer既是觀察內(nèi)容,又是觀察者,起到橋梁/數(shù)據(jù)轉(zhuǎn)發(fā)的作用
**PublishSubject **主題 含義是:在訂閱者訂閱的時間點之后的數(shù)據(jù)發(fā)送給觀察者
** post** 方法發(fā)布一個 Event 對象給 bus,然后由 bus 轉(zhuǎn)發(fā)給訂閱者們。
** toObserverable ** 方法能夠獲得一個包含目標(biāo)事件的 Observable,訂閱者對其訂閱即可響應(yīng)。
**bus.ofType() ** 等效于 bus.filter(eventType::isInstance).cast(eventType) ,即先過濾事件類型,然后發(fā)射給訂閱者。
public class RxBus {
private static volatile RxBus instance;//volatile 保證instance可見性 禁止指令重排
private final Subject<Object, Object> bus;
private RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
/**
* 單例RxBus
*
* @return RxBus
*/
public static RxBus getInstance() {
if (null == instance) {
synchronized (RxBus.class) {
if (null == instance) {
instance = new RxBus();
}
}
}
return instance;
}
/**
* 發(fā)送一個新事件
*
* @param o
*/
public void send(Object o) {
bus.onNext(o);
}
/**
* 返回特定類型的被觀察者
*
* @param eventType eventType
* @param <T>
* @return
*/
public <T> Observable<T> toObservable(Class<T> eventType) {
return bus.ofType(eventType);
}
}
- MainActivity
CompositeSubscription該對象作為subscription的容器,方便統(tǒng)一取消訂閱
** click** 點擊事件 發(fā)送一個新事件
subscribeDownloadEvent() 訂閱事件
destroy取消訂閱事件
public class MainActivity extends AppCompatActivity {
/**
* 訂閱事件
*/
private CompositeSubscription rxSubscriptions = new CompositeSubscription();
private TextView mTvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvResult = (TextView) findViewById(R.id.tv_result);
//訂閱下載事件
subscribeDownloadEvent();
}
public void click(View view){
RxBus.getInstance().send(new MsgEvent("歡迎使用rxbus"));
}
/**
* RxBus subscribeDownloadEvent()
*/
private void subscribeDownloadEvent() {
rxSubscriptions.add(RxBus.getInstance().toObservable(MsgEvent.class)
.map(new Func1<Object, MsgEvent>() {
@Override
public MsgEvent call(Object o) {
return (MsgEvent) o;
}
})
.subscribe(new Action1<MsgEvent>() {
@Override
public void call(MsgEvent calculateEvent) {
mTvResult.setText(calculateEvent.getResult());
}
}));
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消訂閱,防止內(nèi)存泄漏
if (!rxSubscriptions.isUnsubscribed()) {
rxSubscriptions.unsubscribe();
}
}
}
- MsgEvent 方便給觀察者提供數(shù)據(jù) 通知
public class MsgEvent {
String result;
public MsgEvent(String result) {
this.result = result;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
@Override
public String toString() {
return "MsgEvent{" +
"result='" + result + '\'' +
'}';
}
}