RxJava實(shí)現(xiàn)事件總線 Rxbus代替eventbus 減少庫(kù)的使用

原文地址
什么是Eventbus
EventBus定義:是一個(gè)發(fā)布 / 訂閱的事件總線挤聘。 這么說(shuō)應(yīng)該包含4個(gè)成分:發(fā)布者舷手,訂閱者着倾,事件拾酝,總線。 那么這四者的關(guān)系是什么呢屈呕? 很明顯:訂閱者訂閱事件到總線微宝,發(fā)送者發(fā)布事件棺亭。
總結(jié)一下就是:我訂閱你虎眨,你遇到事情了,發(fā)送事件,或者理解為更新動(dòng)態(tài)嗽桩,我就收到消息岳守。
常用的地方
Eventbus和Rxbus常用于組件間信息的交換與通知,避免采用廣播以及使用一大堆接口來(lái)實(shí)現(xiàn)碌冶。
使用的地方以本次項(xiàng)目來(lái)舉例: 一個(gè)商城界面湿痢,包含一個(gè)RecyclerView和LinearLayout,LinearLayout中是一個(gè)購(gòu)物籃信息扑庞,也就是美團(tuán)那種譬重。當(dāng)點(diǎn)擊RecyclerView中的按鈕時(shí),商品被添加罐氨,LinearLayout中的商品總價(jià)應(yīng)該發(fā)生變化臀规。而這時(shí)候就到了使用Eventbus或者Rxbus的時(shí)候了。 為了增加商品總價(jià)栅隐,常見(jiàn)的方法有這幾種: 1. 在創(chuàng)建adapter的時(shí)候?qū)inearLayout的對(duì)象一并傳入塔嬉,以此可以更改LinearLayout中的TextView 2. 設(shè)置廣播事件。添加商品-》發(fā)送廣播-》處理廣播 3. 設(shè)置接口租悄。添加商品-》觸發(fā)接口 4. 使用觀察者模式谨究。也就是Eventbus以及Rxbus實(shí)現(xiàn)的功能。
以上部分抄自一個(gè)網(wǎng)友泣棋,有的時(shí)候知道怎么回事就是寫不出來(lái)胶哲;好坑,不多說(shuō)了直接上代碼

public class RxBus {
    private static volatile RxBus defaultInstance;
    // 主題
    private final Subject bus;
    // PublishSubject只會(huì)把在訂閱發(fā)生的時(shí)間點(diǎn)之后來(lái)自原始Observable的數(shù)據(jù)發(fā)射給觀察者
    public RxBus() {
        bus = new SerializedSubject<>(PublishSubject.create());
    }
    // 單例RxBus
    public static RxBus getDefault() {
        RxBus rxBus = defaultInstance;
        if (defaultInstance == null) {
            synchronized (RxBus.class) {
                rxBus = defaultInstance;
                if (defaultInstance == null) {
                    rxBus = new RxBus();
                    defaultInstance = rxBus;
                }
            }
        }
        return rxBus;
    }
    // 提供了一個(gè)新的事件
    public void post (Object o) {
        bus.onNext(o);
    }
    // 根據(jù)傳遞的 eventType 類型返回特定類型(eventType)的 被觀察者
    public <T> Observable<T> toObserverable (Class<T> eventType) {
        return bus.ofType(eventType);
    }
}


自定義event 實(shí)現(xiàn)數(shù)據(jù)拆分

public class RxEvent {
    public int reciveType;
    public int eventType;
    public String eventAction;
    public  Object event;

    public RxEvent() {
    }

    /**
     * RxBus 事件
     * @param reciveType 接收者類型
     * @param eventType 事件類型
     * @param eventAction 事件Action
     * @param event       時(shí)間
     */
    public RxEvent(int reciveType, int eventType, String eventAction, Object event) {
        this.reciveType = reciveType;
        this.eventType = eventType;
        this.eventAction = eventAction;
        this.event = event;
    }



    public Object getEvent() {
        return event;
    }

}

在項(xiàng)目中的使用,注意要在activity或者是fragment的start中注冊(cè)Subscription觀察者事件,并且在onDestroy中將解除注銷事件外傅,在android中使用過(guò)程中可以結(jié)合Rxandroid一起使用纪吮,

Subscription rxMainBus = RxBus.getDefault().toObserverable(RxEvent.class)
                .filter(rxEvent -> {
        //此處可以通過(guò)Rxjava的filter過(guò)濾函數(shù)對(duì)數(shù)據(jù)進(jìn)行過(guò)濾,從而得到自己想要的數(shù)據(jù)
                    if ((rxEvent.reciveType == IStatics.DATA_BROADCAST || 
                  rxEvent.reciveType ==IStatics.DATA_ALL) && (rxEvent.eventType == 
                  IStatics.EVENT_MAIN || rxEvent.eventType ==IStatics.EVENT_ALL_THREAD)) {
                        return true;
                    }
                    return false;
                })
              //.observeOn(Schedulers.computation())//可以設(shè)置為子線程中接收數(shù)據(jù)
                .observeOn(AndroidSchedulers.mainThread())//設(shè)置為主線程接收數(shù)據(jù)
                .subscribe(new Action1<RxEvent>() {
                               @Override
                               public void call(RxEvent rxEvent) {
                                   switch (rxEvent.eventAction) {
                                      //此處可以根據(jù)事件類型分析數(shù)據(jù)萎胰,一對(duì)應(yīng)不同的操作

                                   }
                               }
                           },
                        new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                // TODO: 處理異常
                            }
                        });

特別注意的是一定要在onDestroy中解除事件的注銷碾盟,以保證不出現(xiàn)內(nèi)存泄漏

if (rxMainBus != null && !rxMainBus.isUnsubscribed()) {    rxMainBus.unsubscribe();}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市技竟,隨后出現(xiàn)的幾起案子冰肴,更是在濱河造成了極大的恐慌,老刑警劉巖榔组,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熙尉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搓扯,警方通過(guò)查閱死者的電腦和手機(jī)检痰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锨推,“玉大人铅歼,你說(shuō)我怎么就攤上這事公壤。” “怎么了椎椰?”我有些...
    開(kāi)封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵厦幅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慨飘,道長(zhǎng)确憨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任瓤的,我火速辦了婚禮休弃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈膏。我一直安慰自己玫芦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布本辐。 她就那樣靜靜地躺著桥帆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慎皱。 梳的紋絲不亂的頭發(fā)上老虫,一...
    開(kāi)封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音茫多,去河邊找鬼祈匙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛天揖,可吹牛的內(nèi)容都是我干的夺欲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼今膊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼些阅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斑唬,我...
    開(kāi)封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤市埋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后恕刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤谎,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年褐着,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡含蓉,死狀恐怖频敛,靈堂內(nèi)的尸體忽然破棺而出裕坊,到底是詐尸還是另有隱情孤里,我是刑警寧澤蚕冬,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布宿刮,位于F島的核電站岂嗓,受9級(jí)特大地震影響汁展,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厌殉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一食绿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧公罕,春花似錦器紧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至罐柳,卻和暖如春掌腰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背张吉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工齿梁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肮蛹。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓勺择,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伦忠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子省核,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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