阿里系列聊完(12篇P5到P8+),这篇进入美团。美团注重实战——"ScrollView嵌套RecyclerView怎么解决?Intent传大数据怎么办?"不考太深原理,考你能不能干活。
今天8道题覆盖美团初级核心考点。
Q1:Activity和Fragment的生命周期关系?
Activity生命周期:onCreate → onStart → onResume → (运行中) → onPause → onStop → onDestroy。
Fragment生命周期:onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → (运行中) → onPause → onStop → onDestroyView → onDestroy → onDetach。
嵌套关系:Fragment生命周期受宿主Activity控制。Activity onPause时所有Fragment都onPause。Activity销毁时Fragment的onDestroy在Activity的onDestroy之后。
追问:Fragment间通信推荐共享ViewModel(activityViewModels())——两个Fragment持有同一ViewModel实例通过LiveData通信。不推荐直接互相引用(耦合高)。
Q2:Intent传值有什么限制?大数据怎么传?
Intent限制:Bundle约1MB上限,超过TransactionTooLargeException。
大数据方案:传ID让接收方自查;全局单例缓存传key;大数据写临时文件传URI。
Parcelable vs Serializable:传对象推荐Parcelable(内存操作,性能高10倍),Serializable走磁盘IO。
追问:Google推荐用ActivityResult API替代startActivityForResult。registerForActivityResult注册回调,launch(intent)启动,支持生命周期感知。
Q3:ScrollView嵌套RecyclerView滑动冲突?
问题:两者都能垂直滑动,嵌套后滑动冲突。
方案1:RecyclerView设置setNestedScrollingEnabled(false),让ScrollView管滑动。但RecyclerView失去复用(所有item一次创建)。
方案2(推荐):用NestedScrollView替代ScrollView。NestedScrollView实现NestedScrolling接口,跟RecyclerView协调滑动。
方案3(最佳):不嵌套。头部和列表放同一个RecyclerView——头部一种ViewType,item另一种ViewType。
追问:CoordinatorLayout+AppBarLayout+RecyclerView协调滑动——RecyclerView通过NestedScrolling把滑动距离传给AppBarLayout,AppBarLayout按scrollFlags折叠/展开。
Q4:BaseAdapter怎么优化?
ViewHolder模式:convertView为null时inflate布局创建ViewHolder并setTag,否则getTag复用。ViewHolder缓存子View引用避免重复findViewById。
追问:RecyclerView.Adapter内置ViewHolder(强制使用),支持LayoutManager、ItemDecoration、ItemAnimator、DiffUtil局部刷新。新项目直接用RecyclerView。
Q5:Fragment懒加载怎么实现?
问题:ViewPager+Fragment默认预加载相邻Fragment,不可见也执行onCreateView和网络请求。
方案:isLoaded标记 + setUserVisibleHint(ViewPager)或onResume(ViewPager2)判断可见时加载。ViewPager2配合setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT_NONE)实现真正懒加载。
追问:ViewPager2基于RecyclerView,支持垂直滑动和RTL。FragmentStateAdapter在不可见时销毁View节省内存。
Q6:RecyclerView的缓存机制?
RecyclerView四级缓存:
Scrap:屏幕内正在显示的ViewHolder,layout时detach再attach。
CachedViews:刚滑出屏幕的ViewHolder(默认2个),按position匹配直接复用不重新bind。
ViewCacheExtension:自定义缓存,很少用。
RecycledViewPool:按viewType缓存(每种默认5个),复用时重新bind。跨RecyclerView可共享。
追问:RecyclerView四级缓存比ListView两级更精细。CachedViews按position精确匹配,ListView只能按viewType匹配。RecycledViewPool支持跨列表共享。
Q7:EventBus怎么用的?有什么缺点?
用法:定义事件类 → 注册EventBus.getDefault().register(this) → 发送EventBus.getDefault().post(event) → 接收方法加@Subscribe注解。
线程模式:POSTING(发送线程执行)、MAIN(主线程)、BACKGROUND(后台线程)、ASYNC(独立线程)。
缺点:事件类定义多了难管理(不知道哪些事件在哪些地方发送/接收)。调试困难——事件流不可追踪,出Bug要全局搜post调用。性能问题——注解处理器反射查找订阅者,注册时遍历方法找@Subscribe。
替代方案:LiveData/StateFlow(ViewModel共享数据,生命周期安全)、Kotlin Channel(协程通信,类型安全)、SharedFlow(一对多事件分发,替代EventBus的post/subscribe模式)。新项目推荐SharedFlow替代EventBus——支持背压、不需要注册/反注册、编译期检查类型。
Q8:美团面试有什么特别的?
注重实战:美团面试喜欢问"你项目中怎么做的"而不是"这个原理是什么"。准备项目经验要具体——用了什么方案、为什么选这个、踩过什么坑、效果数据怎样。
组件化:美团是组件化先行者,面试常问组件间通信、路由方案、资源隔离。初级不需要太深但要了解基本概念。
工程化:美团重视工程能力——CI/CD、自动化测试、多渠道打包(美团有几万个渠道)、热修复。能讲清楚这些加分。
业务理解:美团是本地生活App(外卖/到店/酒旅/打车),面试可能问你怎么设计一个外卖订单列表页、到店商家详情页。展示你对业务的理解。
面试Tips:美团初级面试Activity/Fragment考生命周期和通信方式。Intent考传值限制和大数据方案。ScrollView嵌套考NestedScrolling机制。BaseAdapter考ViewHolder模式。RecyclerView考四级缓存。Fragment考懒加载。美团面试风格务实,准备时多讲项目实战经验少背八股文。
下一篇进入美团中级——Retrofit+RxJava、Glide缓存、LiveData、ViewModel。
面试被问过ScrollView嵌套的同学评论区聊聊,你用的哪种解决方案?
本系列连载中,关注不迷路,下一篇:美团中级Android工程师面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。