Kotlin 协程面试题大全Android 高频版这一篇不是只背答案而是真正理解协程面试底层逻辑内容包括协程基础、suspend 原理、Continuation、Dispatcher、Job、Flow、Retrofit、Room、Compose、高频陷阱题、Android 实战。一、什么是协程标准回答Kotlin 协程是一种轻量级线程它可以挂起恢复非阻塞执行异步任务核心目标用同步代码写异步逻辑加分回答协程本质Continuation 状态机不是线程而是编译器生成的状态机对象。二、协程和线程区别对比线程协程创建成本高很低调度OS调度用户态调度阻塞容易阻塞挂起不阻塞数量少可非常多切换成本高极低高频一句话协程运行在线程上但不是线程。三、什么是 suspend标准回答suspend表示函数可以挂起不会阻塞线程。加分回答suspend编译后会变成Continuation参数即CPSContinuation Passing Style转换四、suspend 是否会自动开线程标准答案不会。高频误区很多人以为suspend 异步线程—错误。正确理解suspend只是支持挂起与恢复是否异步取决于launch/async/Dispatcher五、delay 为什么不卡线程标准答案因为delay挂起的是协程不是线程。底层流程保存Continuation ↓ 线程释放 ↓ 时间到 ↓ resume恢复六、Thread.sleep 和 delay 区别对比Thread.sleepdelay阻塞线程是否阻塞协程是是是否释放线程否是高频一句话sleep 卡线程delay 不卡线程。七、launch 和 async 区别launchasync无返回值有返回值返回 Job返回 Deferred// launchlaunch{}// asyncvalresultasync{}.await()八、withContext 和 launch 区别launchwithContext开启新协程切换线程并等待结果高频点withContext是 suspend会等待执行完成。九、CoroutineScope 是什么标准答案协程必须运行在CoroutineScope中负责生命周期Job 管理协程取消十、GlobalScope 为什么不推荐原因生命周期不可控容易内存泄漏。不推荐Android 推荐GlobalScopeviewModelScope/lifecycleScope十一、协程取消原理标准答案协程是协作式取消不是线程强杀。原理挂起点delay()/yield()会检查isActive十二、为什么 while(true) cancel 不掉错误while(true){}因为没有检查取消状态。正确while(isActive){}十三、Job 是什么标准答案每个协程都有 Job作用cancel/join/ 父子协程管理十四、SupervisorJob 是什么普通 JobSupervisorJob一个子协程失败全部取消子协程互不影响Android 高频使用。十五、CoroutineContext 是什么标准答案协程上下文内部保存DispatcherJobCoroutineNameExceptionHandler本质Map 结构十六、Dispatchers 有哪些Dispatcher用途Main主线程IOIO操作DefaultCPU密集型Unconfined不推荐十七、Dispatchers.IO 和 Default 区别IODefault网络、数据库、文件CPU计算、排序、JSON解析十八、withContext(IO) 为什么常用因为避免主线程阻塞withContext(Dispatchers.IO){// 网络/数据库操作}十九、Retrofit 为什么支持 suspend标准答案Retrofit 底层拿到了Continuation网络完成后调用resume()恢复协程。二十、Retrofit suspend 为什么不卡主线程因为OkHttp异步线程池Continuation恢复二十一、Room 为什么查询用 Flow因为查询是持续变化的数据源适合 Flow。二十二、为什么 insert/update/delete 用 suspend因为一次性操作不需要持续数据流。二十三、Flow 是冷流还是热流默认 Flow 是冷流Cold Flow意思没人 collect 就不会执行。二十四、StateFlow 是什么热流Hot Flow特点有初始值永远活着保存最新值二十五、SharedFlow 是什么用于事件流例如Toast、Snackbar、页面跳转二十六、StateFlow 和 SharedFlow 区别StateFlowSharedFlow有状态无状态必须初始值不需要保存最新值可不保存UI状态事件通知二十七、LiveData 和 Flow 区别维度LiveDataFlow归属Android 框架组件Kotlin 协程库生命周期自带感知自动防泄漏无感知需要自己结合 repeatOnLifecycle线程切换不方便只能 observe 主线程天然支持 flowOn 随意切线程数据变换只有简单 map、switchMap算子超多map/filter/transform/flatMapConcat 等冷热流属于热流有观察者才发数据默认冷流没人收集就不生产数据依赖安卓专属离不开 Android纯 Kotlin跨平台可用适用场景页面 UI 状态简单观察复杂数据流、连续事件、网络轮询、本地数据库现代 AndroidFlow 已逐渐替代 LiveData,最简总结LiveData专为UI 观察设计生命周期感知只能在主线程用功能简单。FlowKotlin 协程的数据流跨线程、可变换、可链式操作、功能更强不绑定 UI全场景通用。新项目直接 抛弃 LiveData用 StateFlow 代替二十八、collect 和 collectLatest 区别collectcollectLatest前一个没结束后一个等待新数据到来取消旧任务搜索场景高频使用。二十九、flatMapLatest 为什么重要核心作用自动取消旧请求搜索框场景用户输入 a → ab → abc旧搜索自动取消。三十、Compose 中为什么不能直接 launch因为Compose 会重组可能重复创建协程。正确LaunchedEffect/rememberCoroutineScope三十一、LaunchedEffect 和 rememberCoroutineScope 区别API用途LaunchedEffect自动生命周期协程rememberCoroutineScope用户事件协程三十二、collectAsState 本质Flow → Compose State(把 Flow 数据流变成 Compose 能刷新 UI 的 State 变量。)Flow emit 时自动重组 UI。三十三、协程为什么轻量因为本质只是对象 状态机不是 OS 线程。三十四、Continuation 是什么协程执行现场保存label状态机位置局部变量执行位置三十五、协程为什么能恢复因为continuation.resume()三十六、label 是什么状态机位置label位置0开始1delay后2第二次挂起后三十七、协程本质是什么编译器把 suspend 转成状态机核心是Continuationresume状态机三十八、为什么 suspend 只能在协程里调用因为需要Continuation普通函数没有。三十九、Flow 为什么默认不卡线程因为Flow 本身不指定线程线程由flowOn()决定。四十、flowOn 和 withContext 区别flowOnwithContext改变上游线程改变当前协程线程四十一、为什么推荐 viewModelScope因为生命周期自动管理ViewModel 销毁时协程自动 cancel。四十二、协程异常传播普通子协程异常 → 父协程取消SupervisorJob互不影响四十三、CoroutineExceptionHandler 有什么用全局协程异常处理CoroutineExceptionHandler{_,e-// 全局处理}四十四、企业级最佳实践高频不要要GlobalScopeviewModelScopeUI直接请求网络UI → ViewModel → Repository → Retrofit/Room四十五、终极面试题压轴Kotlin 协程本质是什么推荐答案Kotlin 协程本质是编译器把 suspend 函数转换成状态机通过 Continuation 保存执行现场在挂起后通过 resume 恢复执行从而实现非阻塞异步编程。四十六、真正的大脑模型最重要看到自动想到suspendContinuation 状态机delay()挂起协程不阻塞线程Flow持续数据流StateFlowCompose UI状态最后一段真正拉开差距普通开发者高级开发者会写 launch理解 Continuation 状态机 Flow 响应式架构 Compose状态驱动真正决定你水平的不是会不会 API而是你是否真正理解协程运行机制。