网站攻击一般有那些,济南网络推广公司有哪些,室内装修软件哪个好,企业外贸网站在 Android 的 MVVM 架构中#xff0c;ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件#xff0c;但二者有一些关键区别#xff1a; 1. ViewModel
基本用途#xff1a;用于存储和管理与 UI 相关的数据#xff0c;生命周期与 Activity/Fragment 解耦…在 Android 的 MVVM 架构中ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件但二者有一些关键区别 1. ViewModel
基本用途用于存储和管理与 UI 相关的数据生命周期与 Activity/Fragment 解耦即使配置变更如屏幕旋转数据也不会丢失。依赖关系不直接依赖 Android 框架如 Context。适用场景适合纯逻辑数据处理不需要 Context 的情况。示例代码class MyViewModel : ViewModel() {private val _data MutableLiveDataString()val data: LiveDataString get() _datafun fetchData() {// 业务逻辑无需 Context_data.value Hello, ViewModel!}
}2. AndroidViewModel
基本用途继承自 ViewModel但内部持有 Application 上下文通过 getApplication() 获取。依赖关系依赖 Application 上下文注意避免持有 Activity 的 Context防止内存泄漏。适用场景需要访问 Android 系统资源如数据库、SharedPreferences、资源文件等时使用。示例代码class MyAndroidViewModel(application: Application) : AndroidViewModel(application) {private val _data MutableLiveDataString()val data: LiveDataString get() _datafun fetchData() {// 使用 Application 上下文如访问资源或数据库val appName getApplicationApplication().resources.getString(R.string.app_name)_data.value Data from ${appName}}
}关键区别总结
特性ViewModelAndroidViewModel父类androidx.lifecycle.ViewModelViewModel 的子类Context 支持无提供 Application 上下文使用场景纯逻辑处理需要访问 Android 系统资源如数据库内存泄漏风险无低仅持有 Application Context 如何选择
优先用 ViewModel除非需要 Context否则尽量用 ViewModel避免不必要的上下文依赖。谨慎使用 Context即使使用 AndroidViewModel也只用 Application 上下文切勿持有 Activity 或 View 的引用。 扩展说明
如果只需要 Application 上下文也可以通过依赖注入如 Hilt将 Application 注入到普通 ViewModel 中而非继承 AndroidViewModel。这是更现代的做法class MyViewModel Inject constructor(private val application: Application
) : ViewModel() { ... }根据需求选择合适的方式保持代码的清晰和可测试性。