Files
mkdocs/docs/android面试/开源框架/EventBus原理.md
2026-01-15 11:53:37 +08:00

2.5 KiB
Raw Blame History

EventBus原理

目录


EventBus原理

定义

// EventBus事件总线
// 基于观察者模式
// 组件间解耦通信

核心概念

// 1. Event事件
// 2. Subscriber订阅者
// 3. Publisher发布者

事件总线

架构

// EventBus 使用单例模式
// 维护订阅者列表
// 事件发布时,通知所有订阅者

订阅机制

订阅事件

// 注册订阅者
EventBus.getDefault().register(this);

// 订阅方法
@Subscribe
public void onEvent(MessageEvent event) {
    // 处理事件
}

// 注销订阅者
EventBus.getDefault().unregister(this);

发布事件

// 发布事件
EventBus.getDefault().post(new MessageEvent("Hello"));

线程模式

线程模式类型

// 1. POSTING发布线程默认
@Subscribe(threadMode = ThreadMode.POSTING)

// 2. MAIN主线程
@Subscribe(threadMode = ThreadMode.MAIN)

// 3. BACKGROUND后台线程
@Subscribe(threadMode = ThreadMode.BACKGROUND)

// 4. ASYNC异步线程
@Subscribe(threadMode = ThreadMode.ASYNC)

EventBus源码分析

关键类

// EventBus事件总线
// SubscriberMethodFinder订阅方法查找
// Subscription订阅信息

关键流程

// 1. register():注册订阅者
// 2. findSubscriberMethods():查找订阅方法
// 3. post():发布事件
// 4. postToSubscription():通知订阅者

EventBus最佳实践

1. 及时注销

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

2. 使用合适的线程模式

// 根据需求选择线程模式
@Subscribe(threadMode = ThreadMode.MAIN)

面试常见问题

Q1: EventBus 的原理?

答案:

  • 基于观察者模式
  • 维护订阅者列表
  • 事件发布时通知所有订阅者

Q2: EventBus 的线程模式?

答案:

  1. POSTING发布线程
  2. MAIN主线程
  3. BACKGROUND后台线程
  4. ASYNC异步线程

Q3: EventBus 的优缺点?

答案:

  • 优点:解耦、易用
  • 缺点:可能内存泄漏、难以追踪

最后更新2024年