LiveData
外观
LiveData是Android架构组件库中的一个可观察数据持有者类,特别设计用于与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[编辑 | 编辑源代码]
在Activity或Fragment中观察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)
}
实际应用案例[编辑 | 编辑源代码]
实时搜索功能[编辑 | 编辑源代码]
数据库观察[编辑 | 编辑源代码]
结合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处理更复杂的数据流场景