Android ViewModel 基类封装
在开发Android应用时,数据管理和UI状态保持是两个重要的开发需求。Android的Architecture Components为我们提供了ViewModel来解决这些问题。ViewModel的设计目标是为了在配置更改(如屏幕旋转)的情况下,保持UI相关的数据。下面我们将探讨如何封装一个基类ViewModel,以便更好地管理应用状态和生命周期。
ViewModel 基类的创建
我们首先需要定义一个基类ViewModel,它将负责处理数据相关的逻辑和通用的状态管理。在基类中,我们可以添加一些常用的功能,比如加载状态、网络请求等。
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
open class BaseViewModel : ViewModel() {
private val _loading = MutableLiveData<Boolean>()
val loading: LiveData<Boolean> get() = _loading
private val _error = MutableLiveData<String>()
val error: LiveData<String> get() = _error
fun setLoading(isLoading: Boolean) {
_loading.value = isLoading
}
fun setError(errorMessage: String) {
_error.value = errorMessage
}
override fun onCleared() {
super.onCleared()
// 清理资源
}
}
在这个 BaseViewModel
类中,我们创建了两个 LiveData
对象 _loading
和 _error
,分别用于管理加载状态和错误信息。在子类中,我们可以简单地使用这些功能,而无需重复代码。
继承 BaseViewModel
接下来,我们可以定义一个具体的ViewModel,例如用于用户信息的 ViewModel,继承自我们的 BaseViewModel
。
class UserViewModel : BaseViewModel() {
private val _userData = MutableLiveData<User>()
val userData: LiveData<User> get() = _userData
fun fetchUserData(userId: String) {
setLoading(true)
// 模拟网络请求
// 在实际应用中,这里会进行网络请求
try {
val user = UserRepository.getUser(userId) // 假设的网络请求
_userData.value = user
setLoading(false)
} catch (e: Exception) {
setError("Failed to load user data")
setLoading(false)
}
}
}
在 UserViewModel
中,我们可以通过 fetchUserData
函数来请求用户数据。任何涉及到加载状态和错误的处理都依然能够得益于从 BaseViewModel
中继承的功能。
饼状图 - 状态分布
为了可视化我们的ViewModel状态,可以使用饼状图来展示不同状态的分布。这可以帮助我们快速理解应用当前的状态。
pie
title ViewModel 状态分布
"Loading": 40
"Error": 20
"Success": 40
状态图 - ViewModel 生命周期
为了进一步理解ViewModel的生命周期,我们可以使用状态图来展示其不同状态的转换。
stateDiagram
[*] --> Idle
Idle --> Loading : fetchUserData()
Loading --> Success : Data Loaded
Loading --> Error : Error Occurred
Success --> Idle : Reset
Error --> Idle : Retry
结论
通过封装 BaseViewModel
,我们不仅可以重复使用常见的功能,还能使得我们具体的ViewModel保持简洁。确保在应用的复杂逻辑中,ViewModel能够保持数据的一致性和状态的清晰。正确使用ViewModel能有效提升应用的稳定性和用户体验。希望这篇文章能够帮助你在Android开发中更好地理解和应用ViewModel概念。