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概念。