Android BaseViewModel 封装

在Android开发中,MVVM(Model-View-ViewModel)是一种常见的架构模式。ViewModel作为MVVM架构中的重要组成部分,承担着界面与数据逻辑之间的调解角色。为了简化ViewModel的管理和复用,我们可以创建一个BaseViewModel的封装类,提供一系列通用的方法和属性,从而提高代码的复用性和可维护性。

BaseViewModel的定义

在我们实现一个BaseViewModel之前,我们需要考虑一些公共的功能,例如:数据的加载、请求的状态管理、错误处理等。以下是一个简单的BaseViewModel示例代码:

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
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

具体的ViewModel实现

在BaseViewModel的基础上,我们可以创建具体的ViewModel。例如,如果我们要创建一个用户信息的ViewModel,可以这样做:

class UserViewModel : BaseViewModel() {

    private val _userData = MutableLiveData<User>()
    val userData: LiveData<User> get() = _userData

    fun fetchUser(userId: String) {
        setLoading(true)
        // Simulate network request
        try {
            // Assume getUserById is a method that fetches user data from a repository
            val user = getUserById(userId)
            _userData.value = user
            setLoading(false)
        } catch (exception: Exception) {
            setError(exception.message ?: "Error fetching user")
            setLoading(false)
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

状态管理与可视化

在MVVM框架中,各种状态的变化非常重要。使用状态图可以很好地表示ViewModel的状态转换。以下是一个简单的状态图,展示了BaseViewModel的状态变化。

fetchUser() data loaded error occurred reset() reset() Idle Loading Loaded Error

关系图

在MVVM架构中,我们的BaseViewModel与其他组件之间的关系也可以用ER图来表示。下面是一个简化的ER图,展示了BaseViewModel、具体ViewModel和其对应的UI组件之间的关系。

BaseViewModel UserViewModel UserActivity Repository data from Inherits Uses Fetches

结尾

通过封装BaseViewModel,我们可以减少重复代码,提高项目的可维护性和可复用性。各种具体的ViewModel可以继承BaseViewModel并实现自身的逻辑,提供用户友好的数据加载和错误处理机制。此外,使用状态图和关系图,可以更清晰地理解ViewModel之间的状态变化及其关系。在实际的Android开发中,这种封装和设计思路无疑会提高开发效率和软件质量。希望本文能够对你理解和使用BaseViewModel有所帮助。