使用RxJava實現的超簡單事件總線RxBus

項目中加入了RxJava,所有很有必要把Eventbus給替換掉了,引用使用RxBus完全滿足了需求了。而且RxBus實現起來超簡單隻需要幾行代碼就好了而且同一使用RxJava來取消綁定,我們可以忽視了Eventbus的unregister的過程,當然我們還是需要在界面結束的時候取消Observable間的訂閱關係。

直接給我RxBus源碼

public class RxBus {
    private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

    public void send(Object o) {
        _bus.onNext(o);
    }

    public Observable<Object> toObserverable() {
        return _bus;
    }

    public boolean hasObservers() {
        return _bus.hasObservers();
    }
}

我們不必要驚呼着幾行代碼居然就能夠實現事件通知呢,因爲RxJava的強大他們已經足夠滿足需求了。我們先聲明一個RxBus出來,供事件發送和接收使用:

    private RxBus _rxBus = null;

    // This is better done with a DI Library like Dagger
    public RxBus getRxBusSingleton() {
        if (_rxBus == null) {
            _rxBus = new RxBus();
        }

        return _rxBus;
    }

發送一條事件:

if (_rxBus.hasObservers()) {
    _rxBus.send(new EventObject());
}

接收一條事件:

        _subscriptions = new CompositeSubscription();

        _subscriptions
              .add(_rxBus.toObserverable()
                    .subscribe(new Action1<Object>() {
                        @Override
                        public void call(Object event) {
                            if (event instanceof EventObject) {
                                _showTapText();
                            }
                        }
                    }));

取消RxBus訂閱關係:

_subscriptions.unsubscribe();

PublishSubject.create()會生成一個只會把在訂閱發生的時間點之後來自原始Observable的數據發射給觀察者。然後我們suscribe讓這個Observable跟我們在界面定義好的Obsever產生訂閱關係:

_rxBus.toObserverable()
                    .subscribe(new Action1<Object>() {
                        @Override
                        public void call(Object event) {
                            if (event instanceof RxBusDemoFragment.TapEvent) {
                                _showTapText();
                            }
                        }
                    })

也就是這段代碼我們使用Action1來接收事件傳遞過來從而處理我們想要做的事情即可。
當然我們看這些心裏肯定不放心 是不是跟我一樣一直不太懂下面這句代碼是幾個意思且爲什麼一句話就可以了呢,所以要追根到底。

private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

首先我們要明白一點Subject是一個既可以當Observable也可以當Observer可以看下這個類的命名方式:

public abstract class Subject<T, R> extends Observable<R> implements Observer<T>

然後我們需要知道SerializedSubject是一個線程安全的Observer並且實現了Subject

public class SerializedSubject<T, R> extends Subject<T, R>

而且PublishSubject也是實現了Subject類

public final class PublishSubject<T> extends Subject<T, T>

知道這些是什麼東西之後,我們還沒知道他們是怎麼掛鉤起來的呢。我們知道Subject既可以是Observer也可以說是Observable所以我們提供了一個方法讓他作爲發射源Observable

    public Observable<Object> toObserverable() {
        return _bus;
    }

這些之後我們就是經典RxJava間的訂閱操作了,當我們調用了rxBus中的send(Object o)方法就可以將o這個對象發射到界面相對應的Action1中去,我們就可以接收到傳遞過來的事件了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章