前言:
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ù)序六。