# EventBus原理 ## 目录 - [EventBus原理](#eventbus原理) - [事件总线](#事件总线) - [订阅机制](#订阅机制) - [线程模式](#线程模式) - [EventBus源码分析](#eventbus源码分析) - [EventBus最佳实践](#eventbus最佳实践) - [面试常见问题](#面试常见问题) --- ## EventBus原理 ### 定义 ```java // EventBus:事件总线 // 基于观察者模式 // 组件间解耦通信 ``` ### 核心概念 ```java // 1. Event:事件 // 2. Subscriber:订阅者 // 3. Publisher:发布者 ``` --- ## 事件总线 ### 架构 ```java // EventBus 使用单例模式 // 维护订阅者列表 // 事件发布时,通知所有订阅者 ``` --- ## 订阅机制 ### 订阅事件 ```java // 注册订阅者 EventBus.getDefault().register(this); // 订阅方法 @Subscribe public void onEvent(MessageEvent event) { // 处理事件 } // 注销订阅者 EventBus.getDefault().unregister(this); ``` ### 发布事件 ```java // 发布事件 EventBus.getDefault().post(new MessageEvent("Hello")); ``` --- ## 线程模式 ### 线程模式类型 ```java // 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源码分析 ### 关键类 ```java // EventBus:事件总线 // SubscriberMethodFinder:订阅方法查找 // Subscription:订阅信息 ``` ### 关键流程 ```java // 1. register():注册订阅者 // 2. findSubscriberMethods():查找订阅方法 // 3. post():发布事件 // 4. postToSubscription():通知订阅者 ``` --- ## EventBus最佳实践 ### 1. 及时注销 ```java @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } ``` ### 2. 使用合适的线程模式 ```java // 根据需求选择线程模式 @Subscribe(threadMode = ThreadMode.MAIN) ``` --- ## 面试常见问题 ### Q1: EventBus 的原理? **答案:** - 基于观察者模式 - 维护订阅者列表 - 事件发布时通知所有订阅者 ### Q2: EventBus 的线程模式? **答案:** 1. POSTING:发布线程 2. MAIN:主线程 3. BACKGROUND:后台线程 4. ASYNC:异步线程 ### Q3: EventBus 的优缺点? **答案:** - **优点**:解耦、易用 - **缺点**:可能内存泄漏、难以追踪 --- *最后更新:2024年*