跳转到内容

LiveData

LiveDataAndroid架构组件库中的一个可观察数据持有者类,特别设计用于与Android生命周期感知组件协同工作。它遵循观察者模式,允许UI组件订阅数据变化,同时自动管理生命周期以避免内存泄漏。

概述[编辑 | 编辑源代码]

LiveData是一个具有生命周期感知能力的数据容器类,主要特点包括:

  • 数据变化时自动通知观察者
  • 自动清理不再活跃的观察者
  • 确保UI与数据状态同步
  • 避免因Activity停止导致的崩溃

核心特性[编辑 | 编辑源代码]

生命周期感知[编辑 | 编辑源代码]

LiveData只会将更新通知给处于活跃生命周期状态(如Activity的STARTED或RESUMED状态)的观察者。

数据持有[编辑 | 编辑源代码]

LiveData包装任意类型的数据,并通过setValue()(主线程)或postValue()(后台线程)方法更新值。

自动清理[编辑 | 编辑源代码]

当关联的LifecycleOwner被销毁时,LiveData会自动移除观察者。

基本用法[编辑 | 编辑源代码]

创建LiveData对象[编辑 | 编辑源代码]

通常在ViewModel中创建LiveData实例:

class MyViewModel : ViewModel() {
    private val _counter = MutableLiveData<Int>()
    val counter: LiveData<Int> = _counter
    
    fun increment() {
        _counter.value = (_counter.value ?: 0) + 1
    }
}

观察LiveData[编辑 | 编辑源代码]

ActivityFragment中观察LiveData:

class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        
        viewModel.counter.observe(this) { count ->
            // 更新UI
            textView.text = count.toString()
        }
    }
}

高级特性[编辑 | 编辑源代码]

转换数据[编辑 | 编辑源代码]

使用Transformations类对LiveData进行转换:

val userLiveData: LiveData<User> = ...
val userName: LiveData<String> = Transformations.map(userLiveData) { user ->
    "${user.firstName} ${user.lastName}"
}

合并数据源[编辑 | 编辑源代码]

使用Transformations.switchMap合并多个LiveData源:

val userIdLiveData: LiveData<String> = ...
val userLiveData: LiveData<User> = Transformations.switchMap(userIdLiveData) { id ->
    repository.getUserById(id)
}

实际应用案例[编辑 | 编辑源代码]

实时搜索功能[编辑 | 编辑源代码]

graph LR A[EditText输入] --> B[ViewModel] B --> C[Repository] C --> D[网络请求] D --> E[LiveData结果] E --> F[UI更新]

数据库观察[编辑 | 编辑源代码]

结合Room持久化库实现自动UI更新:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAllUsers(): LiveData<List<User>>
}

与其他架构组件的关系[编辑 | 编辑源代码]

  • ViewModel配合使用,保存UI相关数据
  • Room集成,实现数据库观察
  • Data Binding结合,实现声明式UI更新

注意事项[编辑 | 编辑源代码]

  • 不要将Context或View引用存储在LiveData中
  • 避免在LiveData观察者中执行耗时操作
  • 考虑使用Kotlin Flow处理更复杂的数据流场景

参见[编辑 | 编辑源代码]