安卓日記——跨元件通訊神器RxBus
阿新 • • 發佈:2019-02-02
RxBus聽名字就知道與RxJava和EventBus有關啦
沒錯這其實是他們的結合體
其實寫一個簡單版的也真心不難,RxBus的程式碼只有十幾行,沒聽錯真的只有十幾行
不過首先你要了解RxJava和EventBus的大概用法,RxJava不用多說,至於EventBus的話他的思想主要就是你在某個地方傳送一個Event,然後在另一個地方接收這個Event,僅此而已。
EventBus在跨元件傳遞資料和解耦方面有得天獨厚的優勢,這些你接觸多久知道了。
現在開講
1.首先匯入rxandroid的包
compile 'io.reactivex:rxandroid:1.0.1'
2.開始寫我們的核心RxBus
public class RxBus {
private static RxBus rxBus=new RxBus();
public static RxBus getRxBusInstance(){
return rxBus;
}
private final Subject bus;
// PublishSubject只會把在訂閱發生的時間點之後來自原始Observable的資料發射給觀察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 提供了一個新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根據傳遞的 eventType 型別返回特定型別(eventType)的 被觀察者
public <T> Observable<T> toObserverable (Class<T> eventType) {
return bus.ofType(eventType);
}
}
3.傳送一個Event
RxBus.getRxBusInstance().post(new TapEvent(i));
4.接收Event
//subscription是型別為Subscription全域性,通常在onDestroy裡unsubscribe
subscription=RxBus.getRxBusInstance().toObserverable(TapEvent.class)
.subscribe(new Subscriber<TapEvent>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(TapEvent tapEvent) {
int n=tapEvent.n;
tvTap.setText(n+"");
}
});
5.取消訂閱
如果不想在某個地方繼續收到Event可以unsubscribe掉那個subscription
通常放在onDestory裡
@Override
public void onDestroy() {
super.onDestroy();
if (!subscription.isUnsubscribed()){
subscription.unsubscribe();
}
}
我還進行了Activity和service的通訊