EventBus 是一种用于简化组件间通信的发布-订阅模式事件总线。它允许在应用程序的不同部分之间解耦通信,例如 Activities, Fragments 和 Services 之间。为了创建一个类似于 EventBus 的自定义实现,我们需要考虑以下几个关键点:
事件模型:定义如何表示和处理事件。
发布/订阅机制:实现注册监听器、发布事件以及注销监听器的功能。
线程调度:决定事件是在哪个线程中被分发。
生命周期管理:确保监听器在其所有者(如 Activity 或 Fragment)销毁时正确地注销。
下面是一个非常简化的自定义 EventBus 实现示例。请注意,这只是一个基础版本,并不包含实际 EventBus 库的所有特性,比如线程调度、粘性事件等高级功能。
import java.util.ArrayList;
import java.util.List;
// 定义一个简单的接口,所有事件处理器都需要实现这个接口。
interface EventListener {
void onEvent(Object event);
}
// 自定义的 EventBus 类。
public class CustomEventBus {
private static final CustomEventBus instance = new CustomEventBus();
private final List<EventListener> listeners = new ArrayList<>();
// 私有构造函数保证单例模式。
private CustomEventBus() {}
// 获取单例实例。
public static CustomEventBus getInstance() {
return instance;
}
// 注册监听器。
public void register(EventListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
// 注销监听器。
public void unregister(EventListener listener) {
listeners.remove(listener);
}
// 发布事件给所有已注册的监听器。
public void post(Object event) {
for (EventListener listener : listeners) {
listener.onEvent(event);
}
}
}
// 使用示例:
// 假设我们有一个具体的事件类型 MyEvent。
class MyEvent {
// 这里可以添加任何你想要传递的数据。
}
// 然后我们可以创建一个监听器,当特定事件发生时执行某些操作。
CustomEventBus.getInstance().register(new EventListener() {
@Override
public void onEvent(Object event) {
if (event instanceof MyEvent) {
// 处理 MyEvent...
}
}
});
// 在需要的地方发布事件。
CustomEventBus.getInstance().post(new MyEvent());