LiveData 用法详解

发布于:2025-08-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

基本概念

LiveData 是 Android Jetpack 组件库中的一个可观察的数据持有类,具有生命周期感知能力,专门为 Android 设计。

核心特性

  1. 生命周期感知:自动管理订阅,避免内存泄漏
  2. 数据驱动UI:当数据变化时自动更新UI
  3. 粘性事件:新观察者会立即收到最后一次的数据
  4. 自动取消订阅:当生命周期处于 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)

    }}

注意事项

  1. 主线程限制value 必须在主线程设置,postValue 可在后台线程
  2. 粘性事件问题:新观察者会立即收到最后一次数据,可能造成重复处理
  3. 配合 ViewModel 使用:通常不单独使用,而是作为 ViewModel 的暴露属性
  4. 避免在 LiveData 中持有 View/Context:防止内存泄漏

与 Flow 的对比

特性

LiveData

Flow

生命周期感知

需要额外处理

粘性事件

冷流(默认非粘性)

线程调度

自动主线程

需要明确指定

复杂数据处理能力

有限

强大

使用场景

UI层简单状态管理

复杂数据流处理

LiveData 最适合在表现层(UI层)管理简单的状态数据,对于复杂的数据流处理,建议考虑使用 Kotlin Flow。


网站公告

今日签到

点亮在社区的每一天
去签到