(2026-07-01)下面是我在MetaApp一面遇到的面试题,主要是根据你项目所用到的技术点来进行询问,需要你了解整个流程。
1. MVVM的特点与好处
MVVM分为View层、ViewModel层、Model层。View层负责界面展示,例如Compose页面、Activity、Fragment,不处理业务逻辑;ViewModel层负责业务逻辑和UI状态管理、对外通过StateFlow暴露状态;Model负责数据来源,包括Retrofit网络请求、Room数据库。 优点:
- 职责分离,UI只负责展示,业务逻辑集中在ViewModel中,代码维护性更好。
- 生命周期安全,ViewModel不会因为屏幕旋转而重新创建,可以保存页面状态。
- 数据驱动UI,Compose监听StateFlow,状态变化后自动重组界面,不需要手动刷新。
2.本地缓存+网络请求更新缓存数据
Repository首先查询Room并返回Flow,ViewModel收集Flow后更新StateFlow,Compose通过collectAsState()监听StateFlow,页面首次会显示缓存数据。同时Repository会发起Retrofit网络请求,请求成功后不会直接更新UI,而是先写入Room。Room内部通过InvalidationTracker监听表变化,数据更新后重新触发Flow.emit(),ViewModel收到新的数据后更新StateFlow,最终Compose自动重组界面。
3. MMKV和SP的区别
两者都是键值对存储,SharedPreferences使用XML文件存储数据,每次修改都会重新序列化整个XML文件,因此数据量变大后,读写性能会下降。 MMKV使用mmap内存映射技术,将文件直接映射到进程地址空间,读写时不需要反复解析XML,性能更高。 除此之外,MMKV还有几个优势:
- 支持增量更新,不会修改一个Key就重写整个文件
- 支持多进程访问
- 内部有CRC校验机制,异常退出后可以恢复数据
4.减少重组的方式和造成重组的原因
当Compose监听的State,例如mutableStateOf、StateFlow.collectAsState()等状态发生变化时,会通知Recomposer,对依赖这些状态的Composable重新执行。 常见导致重组的原因有:mutableState改变、StateFlow更新、remembere失效、参数发生变化 减少重组的方式:使用remember缓存计算结果,避免重复创建对象、使用derivedStateOf,只有真正依赖的数据变化时才重新计算、LazyColumn中合理使用key,避免整个列表刷新。
5.Activity的生命周期
onCreate->onStart->onResume->onPause->onStop->onDestory
6.弹窗、半透明Activity的生命周期
正常Activity从A->B会执行onPause->onStop,因为已经完全不可见,如果打开的是半透明的Activity,A只会执行onPause,不会执行onStop,因为底层页面仍然可见。Dialog本身不是Activity,因此不会触发Activity生命周期。
7.页面之间传输数据的方式
一般来说用Intent,如果数据量比较大,则不会直接通过Intent传递,而是保存到Room或Repository中,再通过ID查询。
列表进入详情页时一般只传递业务ID,而不是整个对象。详情页通过SavedStateHandle或路由参数获取ID,再由ViewModel调用Repository查询Room或网络获取最新数据。这种方式即减少了页面间数据传输,又能保证详情页展示的是最新的数据。