基本概念
LiveData 是 Android Jetpack 组件库中的一个可观察的数据持有类,具有生命周期感知能力,专门为 Android 设计。
核心特性
- 生命周期感知:自动管理订阅,避免内存泄漏
- 数据驱动UI:当数据变化时自动更新UI
- 粘性事件:新观察者会立即收到最后一次的数据
- 自动取消订阅:当生命周期处于 DESTROYED 状态时自动清理
基本用法
1. 创建 LiveData 对象
kotlin
// 通常放在 ViewModel 中private val _currentName = MutableLiveData<String>()val currentName: LiveData<String> = _currentName
2. 观察 LiveData(在 Activity/Fragment 中)
kotlin
viewModel.currentName.observe(this) { newName ->
// 更新UI
nameTextView.text = newName}
3. 更新 LiveData 值
kotlin
// 通常在 ViewModel 中
_currentName.value = "新值" // 主线程使用// 或
_currentName.postValue("新值") // 后台线程使用
高级用法
1. 数据转换
kotlin
val userName: LiveData<String> = Transformations.map(userLiveData) { user ->
"${user.firstName} ${user.lastName}"}
2. 多数据源合并
kotlin
val userData: LiveData<User> = Transformations.switchMap(userIdLiveData) { id ->
repository.getUserById(id)}
3. 自定义 LiveData
kotlin
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
postValue(price)
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}}
注意事项
- 主线程限制:value 必须在主线程设置,postValue 可在后台线程
- 粘性事件问题:新观察者会立即收到最后一次数据,可能造成重复处理
- 配合 ViewModel 使用:通常不单独使用,而是作为 ViewModel 的暴露属性
- 避免在 LiveData 中持有 View/Context:防止内存泄漏
与 Flow 的对比
特性 |
LiveData |
Flow |
生命周期感知 |
是 |
需要额外处理 |
粘性事件 |
是 |
冷流(默认非粘性) |
线程调度 |
自动主线程 |
需要明确指定 |
复杂数据处理能力 |
有限 |
强大 |
使用场景 |
UI层简单状态管理 |
复杂数据流处理 |
LiveData 最适合在表现层(UI层)管理简单的状态数据,对于复杂的数据流处理,建议考虑使用 Kotlin Flow。