MVVM架构使用说明

概述
MVVM(Model-View-ViewModel)是一种软件架构模式,有助于将用户界面(View)的开发与业务逻辑或后端逻辑(Model)的开发分离。在Android开发中,MVVM架构可以提高代码的可维护性、可测试性和可扩展性。
组件说明
View层
View层负责显示数据和处理用户交互。在Android中,View层通常由Activity、Fragment和布局文件组成。
职责:
- 发送用户操作到ViewModel
- 观察ViewModel中的LiveData变化并更新UI
- 不直接访问Model层
ViewModel层
ViewModel是连接View和Model的桥梁,负责处理UI相关的数据和逻辑。
职责:
- 准备和管理UI数据
- 处理用户交互逻辑
- 与Repository通信获取数据
- 不直接访问View层
- 生命周期感知,避免内存泄漏
Model层
Model层负责数据处理和业务逻辑。
职责:
- 数据获取(网络、数据库等)
- 数据处理和转换
- 业务逻辑实现
使用步骤
1. 创建Model
创建数据模型类和数据访问对象(DAO):
kotlin
data class User(
val id: Int,
val name: String,
val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAllUsers(): List<User>
@Insert
fun insertUser(user: User)
}
2. 创建Repository
创建Repository类来管理数据源:
kotlin
class UserRepository {
private val userDao = AppDatabase.getDatabase().userDao()
fun getUsers(): LiveData<List<User>> {
return userDao.getAllUsers()
}
fun addUser(user: User) {
// 在IO线程中执行数据库操作
viewModelScope.launch(Dispatchers.IO) {
userDao.insertUser(user)
}
}
}
3. 创建ViewModel
创建ViewModel类来处理UI逻辑:
kotlin
class UserViewModel(application: Application) : AndroidViewModel(application) {
private val repository = UserRepository()
val users = repository.getUsers()
fun addUser(user: User) {
repository.addUser(user)
}
}
4. 在Activity/Fragment中使用
在Activity或Fragment中观察ViewModel中的LiveData并更新UI:
kotlin
class UserListActivity : AppCompatActivity() {
private lateinit var binding: ActivityUserListBinding
private lateinit var adapter: UserAdapter
private val viewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserListBinding.inflate(layoutInflater)
setContentView(binding.root)
setupRecyclerView()
observeViewModel()
}
private fun setupRecyclerView() {
adapter = UserAdapter()
binding.recyclerView.layoutManager = LinearLayoutManager(this)
binding.recyclerView.adapter = adapter
}
private fun observeViewModel() {
viewModel.users.observe(this) { users ->
adapter.setUsers(users)
}
}
}

示例

项目结构
bash
cn.harry.smartcabinet
├── model # 数据模型和DAO
├── view # Activity、Fragment和适配器
├── viewmodel # ViewModel类
├── repository # 数据仓库
├── database # Room数据库
└── utils # 工具类和扩展函数
最佳实践
-
避免在ViewModel中引用View:ViewModel不应持有Activity或Fragment的引用,以避免内存泄漏。
-
使用LiveData或StateFlow:使用LiveData或StateFlow在ViewModel和View之间传递数据。
-
生命周期感知:利用LiveData的生命周期感知特性,避免在View处于非活跃状态时更新UI。
-
数据绑定:使用Android数据绑定库简化UI更新。
-
协程处理异步操作:在ViewModel中使用Kotlin协程处理异步操作。
-
单一数据源:确保数据只有一个来源,避免数据不一致。
注意事项
-
内存泄漏:确保正确使用生命周期感知组件,避免内存泄漏。
-
配置变更:ViewModel会在配置变更(如屏幕旋转)时保留,确保数据不会丢失。
-
测试:ViewModel的独立性使其更容易进行单元测试。
通过遵循这些指导原则,您可以有效地在Android项目中实现和使用MVVM架构模式。