ViewModel
外观
ViewModel[编辑 | 编辑源代码]
ViewModel是Android架构组件之一,旨在以生命周期感知的方式存储和管理界面相关的数据。它允许数据在配置更改(如屏幕旋转)后继续存在,同时帮助分离业务逻辑与UI组件。
核心特性[编辑 | 编辑源代码]
- 生命周期感知:自动关联Activity/Fragment生命周期
- 数据持久化:在配置更改时保留数据
- UI分离:减少Activity/Fragment的业务逻辑负担
- 作用域控制:通过ViewModelScope管理协程
基本用法[编辑 | 编辑源代码]
创建ViewModel[编辑 | 编辑源代码]
class UserViewModel : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> = _users
init {
loadUsers()
}
private fun loadUsers() {
viewModelScope.launch {
_users.value = repository.getUsers()
}
}
}
在Activity中使用[编辑 | 编辑源代码]
class UserActivity : AppCompatActivity() {
private lateinit var viewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
viewModel.users.observe(this) { users ->
// 更新UI
}
}
}
进阶特性[编辑 | 编辑源代码]
带参数的ViewModel[编辑 | 编辑源代码]
class UserViewModelFactory(private val userId: String) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return UserViewModel(userId) as T
}
}
// 使用方式
val factory = UserViewModelFactory("user123")
viewModel = ViewModelProvider(this, factory).get(UserViewModel::class.java)
与SavedStateHandle集成[编辑 | 编辑源代码]
在进程重建时保存临时数据:
class StateViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
val currentQuery: LiveData<String> = savedStateHandle.getLiveData("query")
fun setQuery(query: String) {
savedStateHandle["query"] = query
}
}
生命周期示意图[编辑 | 编辑源代码]
最佳实践[编辑 | 编辑源代码]
1. 不要持有Context引用:可能导致内存泄漏 2. 轻量化ViewModel:复杂逻辑应委托给Repository层 3. 使用LiveData暴露数据:确保UI安全更新 4. 合理使用作用域:viewModelScope会自动取消协程
与其他组件的关系[编辑 | 编辑源代码]
- 与LiveData配合实现数据观察
- 通过Room访问本地数据库
- 使用WorkManager处理后台任务
- 结合DataBinding简化UI更新