LiveData代替LocalBroadcastManager

前言:

LocalBroadcastManager已經(jīng)被廢棄,如何用LiveData代替本地廣播(LocalBroadcastManager),實(shí)現(xiàn)線程間的通信(抑或不同組件間的通信)伏蚊。
感謝:如何優(yōu)雅的使用LiveData實(shí)現(xiàn)一套EventBus(事件總線)

項(xiàng)目需求:

多線程并發(fā)執(zhí)行的情況下,每個線程都會執(zhí)行各自不同的耗時任務(wù)内边。
比方說挠他,A線程進(jìn)行網(wǎng)絡(luò)請求蔬墩,B線程獲取手機(jī)的位置信息。當(dāng)A線程網(wǎng)絡(luò)請求成功后通知B線程重新獲取位置信息佑淀。那么如何解決線程間的通信留美?
在LocalBroadcastManager沒有被廢棄之前,線程間的通信使用的是LocalBroadcastManager伸刃。但是LocalBroadcastManager被廢棄了谎砾。使用LiveData來代替(沒有使用過的可以先了解一下LiveData)。

實(shí)現(xiàn):

Step1:包裝MutableLiveData(LiveData的子類)捧颅。使之成為全局可訂閱可發(fā)布的對象景图。

public class LiveDataBus {
    public static MutableLiveData<Object> getInstance(String action) {
        return ready().with(action);
    }

    private final Map<String, MutableLiveData<Object>> bus;

    private LiveDataBus() {
        bus = new HashMap<>();
    }

    private static class InstanceHolder {
        static final LiveDataBus INSTANCE = new LiveDataBus();
    }

    private static LiveDataBus ready() {
        return LiveDataBus.InstanceHolder.INSTANCE;
    }


    private MutableLiveData<Object> with(String key) {
        if (!bus.containsKey(key)) {
            MutableLiveData<Object> liveData = new MutableLiveData<>();
            bus.put(key, liveData);
        }
        return bus.get(key);
    }
}

Step2:訂閱MutableLiveData。這里說明一下為什么用到Handler隘道,因?yàn)長iveData的observeForever方法必須在主線程中執(zhí)行症歇,否則報(bào)錯。所以使用Handler將其拋到主線程執(zhí)行谭梗。

new Handler(Looper.getMainLooper()).post(() ->
        LiveDataBus.getInstance("Event1").observeForever(event -> {
            //接收到通知忘晤。
        }));

Step3:發(fā)送數(shù)據(jù)。

 LiveDataBus.getInstance("Event1").postValue("推送數(shù)據(jù)" + i);

特別說明激捏,LiveData默認(rèn)所有消息都是粘性事件设塔。所以不管是先訂閱還是先發(fā)送數(shù)據(jù),訂閱者都能接收到通知远舅。
另外闰蛔,postValue會丟失數(shù)據(jù),也就是說图柏,如果連續(xù)調(diào)用postValue的話只會收到最后一次post的數(shù)據(jù)序六。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者蚤吹。
  • 序言:七十年代末例诀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裁着,更是在濱河造成了極大的恐慌繁涂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二驰,死亡現(xiàn)場離奇詭異扔罪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桶雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門矿酵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唬复,“玉大人,你說我怎么就攤上這事坏瘩≈迅В” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵倔矾,是天一觀的道長。 經(jīng)常有香客問我柱锹,道長哪自,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任禁熏,我火速辦了婚禮壤巷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞧毙。我一直安慰自己胧华,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布宙彪。 她就那樣靜靜地躺著矩动,像睡著了一般。 火紅的嫁衣襯著肌膚如雪释漆。 梳的紋絲不亂的頭發(fā)上悲没,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音男图,去河邊找鬼示姿。 笑死,一個胖子當(dāng)著我的面吹牛逊笆,可吹牛的內(nèi)容都是我干的栈戳。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼难裆,長吁一口氣:“原來是場噩夢啊……” “哼子檀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起差牛,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤命锄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偏化,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脐恩,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年侦讨,在試婚紗的時候發(fā)現(xiàn)自己被綠了驶冒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苟翻。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骗污,靈堂內(nèi)的尸體忽然破棺而出崇猫,到底是詐尸還是另有隱情,我是刑警寧澤需忿,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布诅炉,位于F島的核電站,受9級特大地震影響屋厘,放射性物質(zhì)發(fā)生泄漏涕烧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一汗洒、第九天 我趴在偏房一處隱蔽的房頂上張望议纯。 院中可真熱鬧,春花似錦溢谤、人聲如沸瞻凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阀参。三九已至,卻和暖如春玫坛,著一層夾襖步出監(jiān)牢的瞬間结笨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工湿镀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕吸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓勉痴,卻偏偏與公主長得像赫模,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒸矛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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