Android 响应式编程完整指南:StateFlow、SharedFlow、LiveData 详解
目录
核心概念对比
StateFlow 详解
基本概念
核心特点
基本使用
高级用法
基本概念
核心特点
基本使用
高级用法
LiveData 详解
基本概念
核心特点
基本使用
高级用法
MutableLiveData 详解
基本概念
核心特点
基本使用
实际使用场景
场景1:用户状态管理
场景2:事件处理
场景3:数据列表管理
性能对比
内存使用
线程安全
生命周期管理
协程集成
迁移策略
渐进式迁移
转换工具
最佳实践
选择指南
现代架构推荐
错误处理
总结
技术演进路径
项目建议
学习路径
核心概念对比
特性 | StateFlow | SharedFlow | LiveData | MutableLiveData |
---|---|---|---|---|
初始值 | ✅ 必须有 | ❌ 无初始值 | ✅ 可有可无 | ✅ 可有可无 |
去重机制 | ✅ 自动去重 | ❌ 发射所有值 | ✅ 自动去重 | ✅ 自动去重 |
状态保持 | ✅ 新订阅者收到当前值 | ❌ 无状态保持 | ✅ 新订阅者收到当前值 | ✅ 新订阅者收到当前值 |
生命周期感知 | ❌ 需手动处理 | ❌ 需手动处理 | ✅ 自动感知 | ✅ 自动感知 |
协程支持 | ✅ 原生支持 | ✅ 原生支持 | ❌ 需转换 | ❌ 需转换 |
线程安全 | ✅ 完全线程安全 | ✅ 完全线程安全 | ⚠️ 主线程安全 | ⚠️ 主线程安全 |
热流/冷流 | 热流 | 热流 | 热流 | 热流 |
StateFlow 详解
基本概念
StateFlow 是 SharedFlow 的特殊实现,具有状态保持和去重机制。
核心特点
- 必须有初始值
- 自动去重:只发射与当前值不同的新值
- 状态保持:新订阅者立即收到当前值
- 热流:即使没有收集者,也保持活跃状态
基本使用
class StateFlowExample : ViewModel() {// 创建 StateFlow(必须有初始值)private val _counter = MutableStateFlow(0)val counter: StateFlow<Int> = _counter.asStateFlow()// 更新值fun increment() {_counter.value = _counter.value + 1// 或者使用 emit// _counter.emit(_counter.value + 1)}// 在协程中更新fun updateInCoroutine() {viewModelScope.launch {_counter.emit(100)}}}// 在 UI 中收集lifecycleScope.launch {viewModel.counter.collect { value ->textView.text = "Count: $value"}}
高级用法
class AdvancedStateFlowExample : ViewModel() {// 复杂状态管理private val _uiState = MutableStateFlow(UiState())val uiState: StateFlow<UiState> = _uiState.asStateFlow()// 数据流转换val processedData: StateFlow<List<ProcessedItem>> = _uiState.map { state -> state.items }.map { items -> items.filter { it.isValid } }.stateIn(viewModelScope,SharingStarted.WhileSubscribed(),emptyList())fun updateState(newState: UiState) {_uiState.value = newState}}
SharedFlow 详解
基本概念
SharedFlow 是通用的热流,用于发射事件和值,没有状态保持机制。
核心特点
- 无初始值
- 无去重机制:发射所有值,包括重复值
- 无状态保持:新订阅者不会收到历史值
- 热流:即使没有收集者,也保持活跃状态
基本使用
class SharedFlowExample : ViewModel() {// 创建 SharedFlowprivate val _events = MutableSharedFlow<Event>()val events: SharedFlow<Event> = _events.asSharedFlow()// 发射事件fun emitEvent(event: Event) {viewModelScope.launch {_events.emit(event)}}// 一次性事件fun showMessage(message: String) {viewModelScope.launch {_events.emit(Event.ShowMessage(message))}}}// 在 UI 中收集事件lifecycleScope.launch {viewModel.events.collect { event ->when (event) {is Event.ShowMessage -> showToast(event.message)is Event.Navigate -> navigateTo(event.destination)}}}
高级用法
class AdvancedSharedFlowExample : ViewModel() {// 带重放缓存的 SharedFlowprivate val _events = MutableSharedFlow<Event>(replay = 1, // 重放最后一个事件extraBufferCapacity = 10 // 额外缓冲区)val events: SharedFlow<Event> = _events.asSharedFlow()// 合并多个流val combinedEvents: SharedFlow<CombinedEvent> = merge(userEvents,systemEvents,networkEvents).asSharedFlow()}
LiveData 详解
基本概念
LiveData 是生命周期感知的数据持有者,专门为 Android 组件设计。
核心特点
- 生命周期感知:自动处理生命周期
- 主线程安全:setValue() 必须在主线程调用
- 自动去重:相同值不会重复通知
- 热流:即使没有观察者,也保持活跃状态
基本使用
class LiveDataExample : ViewModel() {// 创建 LiveDataprivate val _userName = MutableLiveData<String>()val userName: LiveData<String> = _userName// 更新值fun updateUserName(name: String) {_userName.value = name}// 在后台线程更新fun updateInBackground() {viewModelScope.launch(Dispatchers.IO) {val newName = repository.getUserName()withContext(Dispatchers.Main) {_userName.value = newName}}}}// 在 Activity/Fragment 中观察viewModel.userName.observe(this) { name ->textView.text = name}
高级用法
class AdvancedLiveDataExample : ViewModel() {// 转换 LiveDataprivate val _user = MutableLiveData<User>()val user: LiveData<User> = _user// 转换用户名为大写val upperCaseName: LiveData<String> = Transformations.map(user) { user ->user?.name?.uppercase() ?: ""}// 过滤有效用户val validUsers: LiveData<List<User>> = Transformations.switchMap(user) { user ->repository.getValidUsers(user?.id)}}
MutableLiveData 详解
基本概念
MutableLiveData 是 LiveData 的可变版本,提供直接的数据修改能力。
核心特点
- 直接修改:可以直接设置值
- 生命周期感知:继承自 LiveData
- 主线程安全:setValue() 必须在主线程
- 简单易用:API 简单直观
基本使用
class MutableLiveDataExample : ViewModel() {// 创建 MutableLiveDataprivate val _isLoading = MutableLiveData<Boolean>()val isLoading: LiveData<Boolean> = _isLoadingprivate val _count = MutableLiveData<Int>()val count: LiveData<Int> = _countinit {// 设置初始值_isLoading.value = false_count.value = 0}// 直接修改值fun setLoading(loading: Boolean) {_isLoading.value = loading}fun incrementCount() {_count.value = (_count.value ?: 0) + 1}}
实际使用场景
场景1:用户状态管理
class UserViewModel : ViewModel() {// StateFlow 方式private val _userState = MutableStateFlow<UserState>(UserState.Loading)val userState: StateFlow<UserState> = _userState.asStateFlow()// LiveData 方式private val _userStateLive = MutableLiveData<UserState>()val userStateLive: LiveData<UserState> = _userStateLivefun loadUser(id: String) {viewModelScope.launch {_userState.value = UserState.Loading_userStateLive.value = UserState.Loadingtry {val user = repository.getUser(id)_userState.value = UserState.Success(user)_userStateLive.value = UserState.Success(user)} catch (e: Exception) {_userState.value = UserState.Error(e.message)_userStateLive.value = UserState.Error(e.message)}}}}
场景2:事件处理
class EventViewModel : ViewModel() {// SharedFlow 方式private val _events = MutableSharedFlow<UiEvent>()val events: SharedFlow<UiEvent> = _events.asSharedFlow()// LiveData 方式(不推荐用于事件)private val _eventsLive = MutableLiveData<UiEvent>()val eventsLive: LiveData<UiEvent> = _eventsLivefun showMessage(message: String) {viewModelScope.launch {_events.emit(UiEvent.ShowMessage(message))}_eventsLive.value = UiEvent.ShowMessage(message)}}
场景3:数据列表管理
class ListViewModel : ViewModel() {// StateFlow 方式private val _items = MutableStateFlow<List<Item>>(emptyList())val items: StateFlow<List<Item>> = _items.asStateFlow()// LiveData 方式private val _itemsLive = MutableLiveData<List<Item>>()val itemsLive: LiveData<List<Item>> = _itemsLivefun loadItems() {viewModelScope.launch {val itemList = repository.getItems()_items.value = itemList_itemsLive.value = itemList}}}
性能对比
内存使用
- StateFlow/SharedFlow:稍高(需要协程作用域)
- LiveData/MutableLiveData:较低
线程安全
- StateFlow/SharedFlow:完全线程安全
- LiveData/MutableLiveData:主线程安全
生命周期管理
- StateFlow/SharedFlow:需要手动处理
- LiveData/MutableLiveData:自动处理
协程集成
- StateFlow/SharedFlow:原生支持
- LiveData/MutableLiveData:需要转换
迁移策略
渐进式迁移
class HybridViewModel : ViewModel() {// 保持现有的 LiveDataprivate val _existingData = MutableLiveData<String>()val existingData: LiveData<String> = _existingData// 新功能使用 StateFlowprivate val _newFeature = MutableStateFlow<NewFeatureState>(NewFeatureState())val newFeature: StateFlow<NewFeatureState> = _newFeature.asStateFlow()// 事件使用 SharedFlowprivate val _events = MutableSharedFlow<Event>()val events: SharedFlow<Event> = _events.asSharedFlow()// 转换函数fun convertToStateFlow(): StateFlow<String> {return existingData.asStateFlow()}}
转换工具
// LiveData 转 StateFlowfun <T> LiveData<T>.asStateFlow(): StateFlow<T> {return this.asFlow().stateIn(CoroutineScope(Dispatchers.Main),SharingStarted.WhileSubscribed(),this.value)}// StateFlow 转 LiveDatafun <T> StateFlow<T>.asLiveData(): LiveData<T> {return this.asLiveData()}
最佳实践
选择指南
使用 StateFlow 当:
- 需要状态管理
- 使用 Jetpack Compose
- 需要初始值
- 需要协程集成
- 需要复杂流操作
使用 SharedFlow 当:
- 处理一次性事件
- 需要发射所有值(包括重复值)
- 不需要状态保持
- 需要事件流
使用 LiveData 当:
- 传统 View 系统
- 需要生命周期感知
- 简单数据观察
- 团队更熟悉 LiveData
使用 MutableLiveData 当:
- 需要直接修改数据
- 简单状态管理
- 现有项目维护
- 快速原型开发
现代架构推荐
class ModernViewModel : ViewModel() {// 1. 状态管理 - StateFlowprivate val _uiState = MutableStateFlow<UiState>(UiState())val uiState: StateFlow<UiState> = _uiState.asStateFlow()// 2. 事件流 - SharedFlowprivate val _events = MutableSharedFlow<UiEvent>()val events: SharedFlow<UiEvent> = _events.asSharedFlow()// 3. 数据流 - StateFlowprivate val _data = MutableStateFlow<List<Data>>(emptyList())val data: StateFlow<List<Data>> = _data.asStateFlow()// 4. 加载状态 - StateFlowprivate val _isLoading = MutableStateFlow(false)val isLoading: StateFlow<Boolean> = _isLoading.asStateFlow()fun loadData() {viewModelScope.launch {_isLoading.value = truetry {val result = repository.getData()_data.value = result_uiState.value = _uiState.value.copy(data = result)} catch (e: Exception) {_events.emit(UiEvent.ShowError(e.message))} finally {_isLoading.value = false}}}}
错误处理
class ErrorHandlingViewModel : ViewModel() {private val _errorEvents = MutableSharedFlow<ErrorEvent>()val errorEvents: SharedFlow<ErrorEvent> = _errorEvents.asSharedFlow()private fun handleError(error: Throwable) {viewModelScope.launch {_errorEvents.emit(ErrorEvent.ShowError(error.message))}}fun safeOperation() {viewModelScope.launch {try {// 执行操作} catch (e: Exception) {handleError(e)}}}}
总结
技术演进路径
- LiveData → StateFlow:状态管理现代化
- MutableLiveData → StateFlow:数据流现代化
- Event Bus → SharedFlow:事件处理现代化
项目建议
- 新项目:优先使用 StateFlow + SharedFlow
- 现有项目:可以混合使用,新功能用 StateFlow
- Compose 项目:必须使用 StateFlow
- 传统项目:LiveData 仍然有效
学习路径
- 先掌握 LiveData 和 MutableLiveData
- 学习 StateFlow 的基本概念
- 理解 SharedFlow 的事件处理
- 实践混合使用
- 逐步迁移到现代化架构
这样的架构既保持了灵活性,又为未来的技术演进留下了空间,是现代 Android 开发的最佳实践。