viewModel

1、ViewModel 作用

答案

管理页面业务数据、处理业务逻辑;生命周期独立于 Activity/Fragment ,屏幕旋转、配置变更数据不丢失

配合viewModelScope管理协程,自动取消防泄漏;

还可实现多 Fragment 共享通信。

2、ViewModel 生命周期特点

答案

配置变更(旋转屏幕、切语言)不销毁

只有页面真正 finish / 彻底销毁时,ViewModel 才会销毁。

3、为什么屏幕旋转 ViewModel 数据不会丢?

答案

ViewModel 存在 ViewModelStore,不和临时重建的 Activity 绑定;

新 Activity 重建后复用同一个 ViewModel 实例,数据保留。

4、ViewModel 能不能持有 Activity 引用?为什么?

答案

不能

ViewModel 生命周期比 Activity 长,强引用会造成内存泄漏

只能使用 Application Context,不能用 Activity 上下文、View 引用。

5、viewModelScope 是什么?作用

答案

ViewModel 自带协程作用域

绑定 ViewModel 生命周期,ViewModel 销毁时自动取消所有协程,杜绝协程泄漏,不用手动 cancel。

6、ViewModel 会不会内存泄漏?什么情况会泄漏

答案 本身设计防泄漏,人为写错才会漏

  1. 持有 Activity/View 强引用
  2. 内部用 GlobalScope 协程
  3. 静态持有 ViewModel 实例
  4. 网络 / 异步回调持有页面引用

7、ViewModel 与 SavedStateHandle 作用

答案

ViewModel 只能保配置变更数据;

系统杀进程、后台重建数据会丢;

SavedStateHandle 可轻量保存简单数据,进程被杀重建也能恢复。

8、多个 Fragment 怎么通信?

答案

共享同一个 ViewModel,通过 LiveData/Flow 收发数据,解耦不用接口回调。

9、ViewModel 和 onSaveInstanceState 区别

答案

ViewModel:存复杂业务数据、列表对象,配置变更不丢;进程被杀不保 。onSaveInstanceState:只存少量基础类型,进程被杀也能恢复,容量小。

10、ViewModel 为什么不建议放 UI 控件?

答案

违背分离架构;ViewModel 不该持有 View 引用,容易内存泄漏、耦合 UI 层。

面试口述极简总结

ViewModel 用于托管页面数据和业务逻辑,生命周期独立于 View,配置变更数据不重建;不持有 Activity 和 View 引用避免内存泄漏;自带 viewModelScope 自动管理协程生命周期;多 Fragment 可共享通信,搭配 SavedStateHandle 还能处理系统杀进程数据恢复。

11、Fragment的ViewModel如何访问到Activity的ViewModel的数据

1、核心一句话

Fragment 和 Activity 共享同一个 ViewModel 实例 ,Fragment 用所属 Activity 的作用域获取 ViewModel,就能直接拿到 Activity 里的数据。

2、具体原理

  1. ViewModel 是按 ViewModelStoreOwner 来隔离实例的;
  2. 如果 Fragment 获取 ViewModel 时,指定 requireActivity() 作为所有者,就会复用 Activity 级别的同一个 ViewModel
  3. 同一个实例里的数据、LiveData、状态,Fragment 直接可读可观察。

3、Activity 里创建

kotlin

csharp 复制代码
val activityVm: MainViewModel by viewModels()

4、Fragment 里获取(关键)

kotlin

csharp 复制代码
val activityVm: MainViewModel by activityViewModels()

activityViewModels() 本质就是以 宿主 Activity 为 ViewModel 持有者,拿到同一份实例。

Fragment 想要访问 Activity 的 ViewModel 数据,直接用 activityViewModels() 方式获取,会以宿主 Activity 为生命周期所有者,拿到和 Activity 同一个 ViewModel 实例,从而共享里面所有数据和 LiveData,实现 Fragment 与 Activity、Fragment 与 Fragment 解耦通信。

12、多个Fragement怎么共享一个ViewModel的数据?

核心原理

多个 Fragment 共用宿主 Activity 作为 ViewModel 持有者,拿同一个 ViewModel 实例,就能共享数据。

两种实现方式

方式一:用 activityViewModels ()(最简单)

每个 Fragment 里都这样写:

kotlin

csharp 复制代码
val sharedVm: HomeViewModel by activityViewModels()
  • 所有 Fragment 拿到同一个 ViewModel 对象
  • 读写同一个变量、观察同一个 LiveData,自动共享数据
方式二:手动指定宿主 Activity

kotlin

scss 复制代码
val vm = ViewModelProvider(requireActivity())[HomeViewModel::class.java]

效果和 activityViewModels() 完全一样。

为什么能共享

  1. ViewModel 是按 ViewModelStoreOwner 隔离实例
  2. 都以 宿主 Activity 为 Owner,就会拿到同一份 ViewModel;
  3. 同一份实例里的变量、LiveData、状态全部互通。

面试一句话口述

多个 Fragment 通过 activityViewModels 方式获取 ViewModel,统一以宿主 Activity 为生命周期持有者,拿到同一个 ViewModel 实例,通过内部 LiveData 实现数据共享和跨 Fragment 通信,解耦且不会内存泄漏。

相关推荐
问心无愧05131 小时前
ctf show web 入门39
android·前端·笔记
千里马学框架1 小时前
WMS/AMS深入WindowState如何正确找到自己在层级结构树中位置进行挂载
android·wms·ai编程·性能·系统开发·车载开发·framework工程师
6666v61 小时前
深入 Android 统一状态模型:MVI 架构的核心实现
android·kotlin
Digitally2 小时前
能否通过蓝牙从安卓传输文件到 iPhone?6 种替代方法
android·iphone
硬件学长森哥2 小时前
Android影像基础-3A在系统平台中的实现
android·图像处理·计算机视觉
私人珍藏库2 小时前
[Android] 哔哩哔哩第三方安卓电视TVapp BV_0.3.16.r898
android·app·工具·软件·多功能
LuDvei2 小时前
android Build Tools安装API选择AVD模拟器下载及设置等操作
android
亘元有量-流量变现2 小时前
小米应用商店ASO优化:紧抓3大核心位,高效提升关键词覆盖
android·aso优化·亘元有量·方糖试玩
YF02112 小时前
Google ML 技术如何在 Android 上落地
android·ai编程·core ml