EventBus 是一種用于簡(jiǎn)化組件間通信的發(fā)布-訂閱模式事件總線。它允許在應(yīng)用程序的不同部分之間解耦通信,例如 Activities, Fragments 和 Services 之間。為了創(chuàng)建一個(gè)類(lèi)似于 EventBus 的自定義實(shí)現(xiàn),我們需要考慮以下幾個(gè)關(guān)鍵點(diǎn):
事件模型:定義如何表示和處理事件。
發(fā)布/訂閱機(jī)制:實(shí)現(xiàn)注冊(cè)監(jiān)聽(tīng)器、發(fā)布事件以及注銷(xiāo)監(jiān)聽(tīng)器的功能。
線程調(diào)度:決定事件是在哪個(gè)線程中被分發(fā)。
生命周期管理:確保監(jiān)聽(tīng)器在其所有者(如 Activity 或 Fragment)銷(xiāo)毀時(shí)正確地注銷(xiāo)。
下面是一個(gè)非常簡(jiǎn)化的自定義 EventBus 實(shí)現(xiàn)示例。請(qǐng)注意,這只是一個(gè)基礎(chǔ)版本,并不包含實(shí)際 EventBus 庫(kù)的所有特性,比如線程調(diào)度、粘性事件等高級(jí)功能。
import java.util.ArrayList;
import java.util.List;
// 定義一個(gè)簡(jiǎn)單的接口,所有事件處理器都需要實(shí)現(xiàn)這個(gè)接口。
interface EventListener {
void onEvent(Object event);
}
// 自定義的 EventBus 類(lèi)。
public class CustomEventBus {
private static final CustomEventBus instance = new CustomEventBus();
private final List<EventListener> listeners = new ArrayList<>();
// 私有構(gòu)造函數(shù)保證單例模式。
private CustomEventBus() {}
// 獲取單例實(shí)例。
public static CustomEventBus getInstance() {
return instance;
}
// 注冊(cè)監(jiān)聽(tīng)器。
public void register(EventListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
// 注銷(xiāo)監(jiān)聽(tīng)器。
public void unregister(EventListener listener) {
listeners.remove(listener);
}
// 發(fā)布事件給所有已注冊(cè)的監(jiān)聽(tīng)器。
public void post(Object event) {
for (EventListener listener : listeners) {
listener.onEvent(event);
}
}
}
// 使用示例:
// 假設(shè)我們有一個(gè)具體的事件類(lèi)型 MyEvent。
class MyEvent {
// 這里可以添加任何你想要傳遞的數(shù)據(jù)。
}
// 然后我們可以創(chuàng)建一個(gè)監(jiān)聽(tīng)器,當(dāng)特定事件發(fā)生時(shí)執(zhí)行某些操作。
CustomEventBus.getInstance().register(new EventListener() {
@Override
public void onEvent(Object event) {
if (event instanceof MyEvent) {
// 處理 MyEvent...
}
}
});
// 在需要的地方發(fā)布事件。
CustomEventBus.getInstance().post(new MyEvent());