1. 程式人生 > >安卓日記——跨元件通訊神器RxBus

安卓日記——跨元件通訊神器RxBus

RxBus聽名字就知道與RxJavaEventBus有關啦
沒錯這其實是他們的結合體
其實寫一個簡單版的也真心不難,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的通訊

效果如下

這裡寫圖片描述

原始碼地址