RxJava:RxBus事件總線

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文地址:http://gank.io/post/560e15be2dca930e00da1083 前言 我從去年...
    AFinalStone閱讀 2,225評論 5 23
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善閱讀 3,586評論 0 0
  • 我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,586評論 7 62
  • 作者寄語 很久之前就想寫一個專題,專寫Android開發框架,專題的名字叫 XXX 從入門到放棄 ,沉淀了這么久,...
    戴定康閱讀 7,670評論 13 85
  • 遠離塵囂 懷揣一疊詩稿,走吧 在靜謐的山里 讀給身旁的石頭聽 餓了到叢林間覓食 采摘鮮美的野果 喝清澈的溪流 和自...
    陳清偉閱讀 271評論 0 2