我學(xué) rxjava 2(5)- RxBus

吐槽


必須吐槽下啊,一直以為 RxBus 是像 EventBus 一樣是1個開源庫呢,誰知道壓根不是這么回事啊,RxBus 只是一個思路:用 rxjava 來實(shí)現(xiàn)一個 EventBus ,沒有規(guī)范,標(biāo)準(zhǔn)的開源庫,需要我們自己去寫,不過好在這么久過去了,有一些大家都認(rèn)可的寫法,這里不是我的原創(chuàng),我也是看別人的,總結(jié)下,代碼不手寫出來就永遠(yuǎn)不是你的。

開工


其實(shí)思路很簡單的,EventBus 怎么設(shè)計咱就怎么設(shè)計。在 rxjava 中用到了 subject 用來進(jìn)行熱發(fā)射和 ofType 操作符

  • 熱發(fā)射不熟悉的朋友可以看我的文章:我學(xué) rxjava 2(3)- 熱發(fā)射
  • ofType 操作符是filter + cast的組合,只發(fā)送特定的類型。fliter用來判斷是否為指定的類型,cast將一個Observable轉(zhuǎn)換為指定的特殊Observable

就這些了,其他的都算是代碼封裝中最簡單的,單例模式。

代碼


這是簡單的不能再簡單了,我就不特別去說了,大家自己領(lǐng)會

package com.bloodcrown.rxbus;

import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;
import io.reactivex.subjects.Subject;

/**
 * 作者 : BloodCrown
 * 時間 : 2018/4/25 下午1:00
 * 描述 :
 */

public class RxBus {

    public static volatile RxBus instance;

    private Subject<Object> bus;

    private RxBus() {
        bus = PublishSubject.create().toSerialized();
    }

    public static RxBus getInstance() {
        if (instance == null) {
            synchronized (RxBus.class) {
                if (instance == null) {
                    instance = new RxBus();
                }
            }
        }
        return instance;
    }

    public void post(Object message) {
        bus.onNext(message);
    }

    public <T> Observable<T> setTag(Class<T> type) {
        return bus.ofType(type);
    }

    public boolean hasObserver() {
        return bus.hasObservers();
    }
}

使用頁很簡單,分步說一下

  1. 前置

管理 rxjava 管道對象

    private CompositeDisposable disposables;
  1. 注冊
            catDisposable = RxBus.getInstance()
                    .setTag(new Cat().getClass())
                    .subscribe(new Consumer<Cat>() {
                        @Override
                        public void accept(Cat cat) throws Exception {
                            Toast.makeText(context, "數(shù)據(jù)2收到", Toast.LENGTH_SHORT).show();
                        }
                    });
            disposables.add(catDisposable);
  1. 解綁
        if (bookDisposable != null && !bookDisposable.isDisposed()) {
            bookDisposable.dispose();
        }

效果演示:


效果演示

好了,就這么多,看著很簡單,大家手寫一遍才真的行啊,練手很不錯的,寫完很有成就感

最后是本篇文章 demo:BW_RxBus

參考資料:


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

推薦閱讀更多精彩內(nèi)容