MVVM(Model-View-ViewModel)架构是 Android 开发中一种常用的架构模式,利用 Android Jetpack 组件,可以更简洁和高效地实现 MVVM。以下是 MVVM 的各个组件及其职责:
Model
Room 数据库、网络请求库(如 Retrofit)等来实现数据获取和存储。View
ViewModel
LiveData 来保存数据并通知 View 更新。// Model
@Entity(tableName = "user")
data class User(
@PrimaryKey val id: Int,
val name: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM user WHERE id = :userId")
fun getUserById(userId: Int): LiveData<User>
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
// ViewModel
class UserViewModel(application: Application) : AndroidViewModel(application) {
private val userDao: UserDao = AppDatabase.getDatabase(application).userDao()
private val _userId = MutableLiveData<Int>()
val user: LiveData<User> = Transformations.switchMap(_userId) { id ->
userDao.getUserById(id)
}
fun setUserId(id: Int) {
_userId.value = id
}
}
// View (Activity)
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.user.observe(this, Observer { user ->
// 更新 UI
findViewById<TextView>(R.id.userName).text = user.name
})
// 设置用户 ID 以触发数据加载
userViewModel.setUserId(1)
}
}
MVI(Model-View-Intent)是另一种架构模式,特别强调单一数据流和不可变状态。MVI 的核心思想是通过 Intent 驱动状态变化,并用单一的状态对象来描述整个 UI。
Model
View
Intent
State
// State
data class UserState(
val user: User? = null,
val isLoading: Boolean = false,
val error: String? = null
)
// Intent
sealed class UserIntent {
data class LoadUser(val userId: Int) : UserIntent()
}
// ViewModel
class UserViewModel : ViewModel() {
private val _state = MutableLiveData<UserState>()
val state: LiveData<UserState> get() = _state
fun processIntent(intent: UserIntent) {
when (intent) {
is UserIntent.LoadUser -> loadUser(intent.userId)
}
}
private fun loadUser(userId: Int) {
_state.value = UserState(isLoading = true)
// 假设 repository 获取用户数据
repository.getUserById(userId, object : Callback<User> {
override fun onSuccess(user: User) {
_state.value = UserState(user = user)
}
override fun onError(error: String) {
_state.value = UserState(error = error)
}
})
}
}
// View (Activity)
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.state.observe(this, Observer { state ->
// 渲染 UI
if (state.isLoading) {
// 显示加载中
} else if (state.user != null) {
findViewById<TextView>(R.id.userName).text = state.user.name
} else if (state.error != null) {
// 显示错误信息
}
})
// 发送 Intent 加载用户数据
userViewModel.processIntent(UserIntent.LoadUser(1))
}
}
优点:
缺点:
优点:
缺点:
选择哪种架构模式,取决于项目的复杂度、团队的熟悉程度以及具体的需求。综合考虑这些因素,可以做出更适合的架构选择。
联系我