Android Repository 模式详解

在Android开发中,Repository模式是一种常见的数据管理机制。它的主要作用是将数据源(通常是网络API、数据库等)与应用层分离开来,使得代码结构更清晰更易于维护。以下是实现Android Repository模式的基本步骤,以及每一步要用到的关键代码。

实现步骤

步骤 描述
1. 定义数据模型
2. 创建数据源(API和DAO)
3. 创建Repository类
4. 在ViewModel中调用Repository
5. 更新UI层

步骤详细说明

1. 定义数据模型

首先,我们需要一个数据模型。例如,创建一个User数据类。

data class User(
    val id: Int,              // 用户ID
    val name: String,        // 用户名
    val email: String        // 用户邮箱
)

2. 创建数据源(API和DAO)

创建一个网络API接口和一个数据库数据访问对象(DAO)。

API接口
interface UserApi {
    // 模拟一个网络请求
    @GET("users")
    suspend fun getUsers(): List<User> // 获取用户列表
}
DAO接口
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    suspend fun getAllUsers(): List<User> // 从数据库获取所有用户
}

3. 创建Repository类

现在我们把API和DAO整合到一个Repository中。

class UserRepository(
    private val userApi: UserApi,   // 网络API
    private val userDao: UserDao     // 数据库DAO
) {
    // 获取用户列表的统一接口
    suspend fun getUsers(): List<User> {
        return try {
            // 从API获取用户
            userApi.getUsers()
        } catch (e: Exception) {
            // 如果出错,就从数据库获取用户
            userDao.getAllUsers()
        }
    }
}

4. 在ViewModel中调用Repository

接下来,我们在ViewModel中调用Repository。

class UserViewModel(private val userRepository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>() // 用户列表
    val users: LiveData<List<User>> get() = _users

    // 加载用户数据
    fun loadUsers() {
        viewModelScope.launch {
            _users.value = userRepository.getUsers() // 获取用户列表
        }
    }
}

5. 更新UI层

最后,将数据传递给UI层。

class UserActivity : AppCompatActivity() {
    private lateinit var userViewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)

        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        userViewModel.loadUsers() // 加载用户数据

        userViewModel.users.observe(this, Observer { users ->
            // 更新UI,例如列表显示用户
            // updateUserList(users)
        })
    }
}

状态图

为了更好地理解整个流程,下面是一个状态图,描述了数据加载的过程:

stateDiagram
    [*] --> Loading
    Loading --> FetchingData: loadUsers()
    FetchingData --> Success: userApi.getUsers()
    FetchingData --> FromDB: Exception
    FromDB --> Success: userDao.getAllUsers()
    Success --> [*]

结论

通过上述步骤,我们实现了一个简单而有效的Android Repository模式。该模式能够很好地将数据源与应用逻辑分离,使得代码更具可读性和可维护性。掌握此模式后,你可以在自己的Android项目中更自如地处理数据,提升开发效率。希望本文能对你有所帮助!