RxBus一步掌握 更快捷的通訊

RxBus–打造極簡(jiǎn)

**原創(chuàng)CSDN **

Rxjava出來(lái)至今,在項(xiàng)目的使用中非常頻繁窟绷,被玩熟的功能也感覺(jué)越來(lái)越強(qiáng)大脖咐。如果你對(duì)Rxbus還有不熟的地方,這篇文章就帶你從實(shí)現(xiàn)的角度與使用的角度了解Rxbus,快速在項(xiàng)目中拂酣。

Rxbus到底是什么

一句話概括:用注冊(cè)訂閱者模式實(shí)現(xiàn)的通訊方式。
簡(jiǎn)簡(jiǎn)單單的一個(gè) 觀察者observable 與 Subscriber仲义。
聽(tīng)起來(lái)很簡(jiǎn)單婶熬,做起來(lái)更簡(jiǎn)單。

RxBus能在項(xiàng)目中做什么

它是以observable 與 Subscriber 實(shí)現(xiàn)的埃撵,正常注冊(cè)訂閱所傳遞的參數(shù)我們都是可以傳遞的赵颅。在項(xiàng)目中我們不例外的都是
Activity,F(xiàn)ragment 互相與各自間的傳遞 String Object暂刘!完全夠用是不是饺谬!傳遞對(duì)象的時(shí)候序列化對(duì)象也不是那么必要的。
是不是感覺(jué)很方便谣拣,一步post掉任何Object與String的參數(shù)募寨。越厲害 越簡(jiǎn)單

我們?yōu)槭裁匆陧?xiàng)目中使用

1,當(dāng)我們項(xiàng)目已經(jīng)導(dǎo)入了Rxjava,RxAndroid 的時(shí)候森缠,你自己創(chuàng)造的Rxbus能替換掉EventBus拔鹰,瞬間發(fā)覺(jué)自己好牛是不是。而且項(xiàng)目中也少一個(gè)三方庫(kù)贵涵,Apk也瘦身咯列肢。
2,方便易用宾茂,一個(gè)你自己完成的極簡(jiǎn)通訊方式瓷马,更不容易出現(xiàn)未知的bug。它的效率也是毋庸置疑的刻炒,很多大項(xiàng)目都是自己創(chuàng)建Rxbus取代EventBus的使用决采。

*RxBus的原理到底是什么

RxBus實(shí)現(xiàn)的方式有很多,整體上原理一直坟奥,細(xì)節(jié)略有不同树瞭,我重點(diǎn)說(shuō)下我的實(shí)現(xiàn)方式。
1爱谁,ConcurrentHashMap 一個(gè)與Hashmap,Hashtable 有點(diǎn)相似的集合晒喷。ConcurrentHashMap采用了分段鎖的設(shè)計(jì),只有在同一個(gè)分段內(nèi)才存在競(jìng)態(tài)關(guān)系访敌,不同的分段鎖之間沒(méi)有鎖競(jìng)爭(zhēng)凉敲。相比于對(duì)整個(gè)Map加鎖的設(shè)計(jì),分段鎖大大的提高了高并發(fā)環(huán)境下的處理能力。但同時(shí)爷抓,由于不是對(duì)整個(gè)Map加鎖势决,導(dǎo)致一些需要掃描整個(gè)Map的方法(如size(),containsValue())需要使用特殊的實(shí)現(xiàn),另外一些方法(如clear())甚至放棄了對(duì)一致性的要求蓝撇。
它的效率科比Hashtable官方說(shuō)快了16倍果复!!

2,維護(hù)的這個(gè)集合可以看成我們observable 與subscriber渤昌。但我為了能能多個(gè)地方注冊(cè)虽抄,集合的第二參數(shù)是集合,里面存放的是subject.(subject也可以理解為observable,它的確是集成自被觀察者的)

3独柑,集合有了迈窟,里面結(jié)構(gòu)已經(jīng)確定,剩下的步驟我們就是不停的往集合里面存數(shù)據(jù)與取數(shù)據(jù)了忌栅!

存 – 理解為訂閱 – 想集合中put一個(gè)subscriber

取 -- 理解創(chuàng)建observable -- 調(diào)用了集合中的subscriber的onnext的方法

是不是好簡(jiǎn)單车酣。道理也就這個(gè)樣子了,具體結(jié)構(gòu)與邏輯的考慮我將在代碼中體現(xiàn)

完整的RxBus

結(jié)構(gòu)考慮得多了點(diǎn)狂秘,你可以根據(jù)自己的需要做一些變化骇径。Rxbus本不難,有一個(gè)自己的rxbus想想多好者春!

/**

  • 用RxJava實(shí)現(xiàn)的EventBus
  • on 2017.03.23
  • 先訂閱 再post 事件就能接受
    */

public class RxBus {

private static RxBus instance;

public static synchronized RxBus getInstance() {

    if (null == instance) {
        instance = new RxBus();
    }
    return instance;
}

private RxBus() {
}

@SuppressWarnings("rawtypes")
private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<Object, List<Subject>>();


/**
 * 注冊(cè)事件源
 *
 * @param tag
 * @return
 */
@SuppressWarnings({"rawtypes"})
public <T> Observable<T> register(@NonNull Object tag) {
    List<Subject> subjectList = subjectMapper.get(tag);
    if (null == subjectList) {
        subjectList = new ArrayList<Subject>();
        subjectMapper.put(tag, subjectList);
    }
    Subject<T, T> subject;
    subjectList.add(subject = PublishSubject.create());
    LogUtils.logd("register" + tag + "  size:" + subjectList.size());
    return subject;
}

@SuppressWarnings("rawtypes")
public void unregister(@NonNull Object tag) {
    List<Subject> subjects = subjectMapper.get(tag);
    if (null != subjects) {
        subjectMapper.remove(tag);
    }
}

/**
 * 取消監(jiān)聽(tīng)
 *
 * @param tag
 * @param observable
 * @return
 */
@SuppressWarnings("rawtypes")
public RxBus unregister(@NonNull Object tag,
                        @NonNull Observable<?> observable) {
    if (null == observable)
        return getInstance();
    List<Subject> subjects = subjectMapper.get(tag);
    if (null != subjects) {
        subjects.remove((Subject<?, ?>) observable);
        if (isEmpty(subjects)) {
            subjectMapper.remove(tag);
            LogUtils.logd("unregister" + tag + "  size:" + subjects.size());
        }
    }
    return getInstance();
}

public void post(@NonNull Object content) {
    post(content.getClass().getName(), content);
}

/**
 * 觸發(fā)事件
 *
 * @param content
 */
@SuppressWarnings({"unchecked", "rawtypes"})
public void post(@NonNull Object tag, @NonNull Object content) {
    LogUtils.logd("post" + "eventName: " + tag);
    List<Subject> subjectList = subjectMapper.get(tag);
    if (!isEmpty(subjectList)) {
        for (Subject subject : subjectList) {
            subject.onNext(content);
            LogUtils.logd("onEvent" + "eventName: " + tag);
        }
    }
}

/*
* Subject 是Observable子類(lèi)
* */
@SuppressWarnings("rawtypes")
public static boolean isEmpty(Collection<Subject> collection) {
    return null == collection || collection.isEmpty();
}

}

RxBus也就這么多的點(diǎn)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市清女,隨后出現(xiàn)的幾起案子钱烟,更是在濱河造成了極大的恐慌,老刑警劉巖嫡丙,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴袭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曙博,警方通過(guò)查閱死者的電腦和手機(jī)拥刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)父泳,“玉大人般哼,你說(shuō)我怎么就攤上這事』菡” “怎么了蒸眠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杆融。 經(jīng)常有香客問(wèn)我楞卡,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任蒋腮,我火速辦了婚禮淘捡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘池摧。我一直安慰自己焦除,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布险绘。 她就那樣靜靜地躺著踢京,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宦棺。 梳的紋絲不亂的頭發(fā)上瓣距,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音代咸,去河邊找鬼蹈丸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呐芥,可吹牛的內(nèi)容都是我干的逻杖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼思瘟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荸百!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起滨攻,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤够话,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后光绕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體女嘲,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年诞帐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欣尼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡停蕉,死狀恐怖愕鼓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谷徙,我是刑警寧澤拒啰,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站完慧,受9級(jí)特大地震影響谋旦,放射性物質(zhì)發(fā)生泄漏剩失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一册着、第九天 我趴在偏房一處隱蔽的房頂上張望拴孤。 院中可真熱鬧,春花似錦甲捏、人聲如沸演熟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芒粹。三九已至,卻和暖如春大溜,著一層夾襖步出監(jiān)牢的瞬間化漆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工钦奋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留座云,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓付材,卻偏偏與公主長(zhǎng)得像朦拖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厌衔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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