当前位置: 首页 > news >正文

viewModel机制及原理总结

1. 核心定义与作用    

ViewModel是Android Jetpack架构组件之一,用于以生命周期感知的方式存储和管理UI相关数据。它的核心目标是:
(1)解决屏幕旋转等配置变更导致的数据丢失问题(避免Activity重建时数据销毁)。
(2)分离UI逻辑与数据逻辑,遵循分离原则(如MVVM架构)。
(3)避免内存泄漏:ViewModel不会持有View或Context的引用,而是通过LifecycleOwner(如Activity/Fragment)关联生命周期。

2. 关键机制与原理  

(1) 生命周期感知  
ViewModel与LifecycleOwner(如Activity)绑定,但其生命周期更长:从Activity创建到完全销毁(onDestroy)时才会被清除(配置变更导致的重建不会销毁ViewModel)。
通过`ViewModelProvider`获取ViewModel实例,保证同一作用域(如同一Activity)内复用实例。

(2) 数据保持原理  
ViewModel存储在`ViewModelStore`中(由Activity/Fragment持有),配置变更时Activity销毁但`ViewModelStore`会被保留,新的Activity重新获取同一ViewModel实例。
底层通过`NonConfigurationInstances`机制实现(系统保留的临时存储)。

(3) 与LiveData的协同  
-常配合LiveData使用,实现数据变化的观察者模式。ViewModel持有LiveData,UI组件(如Activity)观察LiveData,确保数据更新时仅活跃状态的UI接收回调(避免非活跃状态的内存泄漏)。

3. 核心代码流程示例   

// 创建ViewModel
class MyViewModel : ViewModel() {val data: MutableLiveData<String> = MutableLiveData()
}// Activity中获取并观察
class MyActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)viewModel.data.observe(this) { value ->// 更新UI}}
}

4. 注意事项  


禁止持有Context:避免内存泄漏(如需Context,使用`AndroidViewModel`并传入Application Context)。
onCleared()回调:ViewModel被销毁时(如Activity真正退出)可在此释放资源。
数据持久化边界:ViewModel适用于临时UI数据,持久化数据需结合Room等组件。

5. 总结优势  

生命周期安全:数据存活时间与UI所需匹配。
解耦与测试友好:UI逻辑与数据分离,便于单元测试。
高效协作:与Jetpack其他组件(LiveData、DataBinding等)无缝集成。

http://www.dtcms.com/a/593291.html

相关文章:

  • 建立网站免费高端html5网站建设织梦模板
  • 突破最短路径算法的排序障碍:理论计算机的里程碑
  • openGauss 6.0.0 向量版深度测评:国产数据库的 RAG 实践之路
  • 使用豆包大模型语音合成API生成语音文件
  • 创意赣州网站建设logo模板
  • 指针,数组,变量
  • 免费SSL申请并使用Yarp实现支持内网穿透
  • Geoserver修行记_Geoserver如何连接瀚高数据库_国密SM3
  • PC微信WDA算法
  • Parquet 范式:大语言模型训练数据格式优化的基础解析
  • 网站备案的核验单做HH的网站
  • 基于MATLAB的JPEG图像压缩实现
  • 个人网站的建设中铁建设集团有限公司官方网站
  • 耐达讯自动化Profibus转光纤连接伺服驱动器,让电力行业通信效率飙升10倍!
  • 专为AWD攻防演练比赛设计的综合性工具箱,集成漏洞利用、流量监控、自动化攻击等功能
  • 冶金车间“迷雾”重重?耐达讯自动化Profibus转光纤为HMI点亮“透视眼”!
  • 第一章 网络安全概念及规范
  • 中国发行稳定币对金融行业网络安全布局的影响及新的业务增长点分析
  • 华为网站建设和阿里云哪个好投资理财网站模板
  • 近期思考:如何自我提升呢?三年以后有大变化?
  • Ansible主机清单:自动化管理的核心基石
  • 专做高中知识的网站腾讯朋友圈广告代理
  • 「日拱一码」146 SVR调参注意事项与技巧
  • 谷歌云大规模分布式存储系统:定义、特性与技术挑战解析
  • 山东省住房和城乡建设厅服务网站百度网络公司
  • 网站平台需要做无形资产吗 怎么做网站里做个子网页怎么做
  • 在 AEDT 中对用于模拟的作业进行排队
  • FastAPI × Loguru:从“能跑”到“可运维”的日志实战
  • 怎样设立网站网站开发 策划是干嘛的
  • 【大数据技术04】数据可视化