在 Android 开发或后端服务中,阻塞主线程的耗时操作是导致应用卡顿甚至 ANR 的头号原因。这套 Kotlin 协程完全教程,核心解决的是“如何在保证代码逻辑清晰的前提下,高效处理网络请求、数据库读写等耗时任务,避免阻塞 UI 线程”这一实际问题。它不涉及复杂的架构设计,而是专注于如何利用协程的挂起与恢复机制,将原本繁琐的线程切换逻辑(如 `new Thread`、`runnable`)转化为类似同步代码的写法,从而大幅提升代码的可读性与维护性。对于已经熟悉 Kotlin 基础语法,但面对并发编程感到无从下手的开发者来说,这是一门能让你从“写能跑的代码”进阶到“写高响应性能代码”的实战课。
基础门槛与前置建议
本课程适合有一定 Kotlin 语言基础的读者,如果你对 `suspend` 函数、协程作用域(Scope)以及 `launch` 与 `async` 的基本区别感到陌生,建议先通过官方文档或基础教程补齐这部分知识。课程内容侧重于实战场景,对于纯 Java 开发者,你需要额外花费一点时间熟悉 Kotlin 的语法特性。虽然课程会讲解 Android 项目的代码写法,但其原理同样适用于后端 Ktor 服务开发,因此不局限于移动端开发者的读者也可以放心学习。
学习路径与实战产出
建议按照“基础概念 -> 线程切换 -> 高级用法”的逻辑顺序学习。前期重点理解“挂起”和“恢复”这两个核心概念,弄清楚协程是如何在后台线程执行任务并自动切回主线程的。建议先看“切线程”和“自动切回来”的章节,这是理解协程运行机制的关键。随后重点掌握 `withContext()` 的使用,这是手动指定线程上下文最常用的手段。学完这套资料,你将能够独立重构现有的耗时操作代码,用简洁的协程写法替代线程池管理,并能够根据业务场景(如网络请求、文件读写)灵活选择合适的调度器。
资料使用与练习建议
为了真正掌握协程,建议配合项目代码进行调试。不要只看视频,要尝试在本地搭建一个 Android 项目,将视频中的代码片段复制粘贴到你的项目中,通过打断点观察线程变化。特别是“自定义挂起函数”这一节,是进阶的关键,建议手动实现一个模拟网络请求的挂起函数,并测试其在不同线程下的表现。资料包中的项目源码和讲解视频是配套的,看懂代码逻辑后,试着删除其中的线程池配置,改用协程重写,对比两种写法的优劣,这样能最快地建立起对协程的直觉。
课程目录
QQ_1759331032570.png (106. 15 KB, ) 2025-10-1 23: 06 上传 lf1tq5m0kkrktu.jpg (176. 92 KB, ) 2025-10-1 23: 07 上传 ├──1-协程基础与关键知识 | ├──001.0-先导视频.mp4 22.31M | ├──002.1.0-学协程有用吗.mp4 38.20M | ├──003.1.1-切线程:launch().mp4 125.88M | ├──004.1.2-自动切回来:挂起函数.mp4 80.71M | ├──005.1.3-Android 项目里协程代码的写法.mp4 48.79M | ├──006.1.4-withContext():手动切线程.mp4 38.78M | ├──007.1.5-自定义挂起函数.mp4 16.75M | ├──008.1.6-挂起函数的性能优势:从 withContext().mp4 62.64M | ├──009.1.7-消除魔法:挂起函数为什么不卡线程?.mp4 106.22M | ├──010.1.8-「轻量级线程」的本质:从 delay() 说起.mp4 49.17M | ├──011.1.9-结构化并发初探.mp4 99.01M | ├──012.1.10-并行协程的启动和交互.mp4 78.77M | ├──013.1.11-连接线程世界:和回调型 API 协作.mp4 74.37M | └──014.1.12-回到线程世界:runBlocking().mp4 46.67M ├──2-结构化并发 | ├──015.2.1-概念落地:「一个协程」到底指的是什么.mp4 129.59M | ├──016.2.2-父子协程,以及协程间的并行和等待.mp4 88.41M | ├──017.2.3-线程的强制结束:stop().mp4 17.22M | ├──018.2.4-线程的交互式结束:interrupt().mp4 124.49M | ├──019.2.5-协程的交互式取消:cancel().mp4 112.18M | ├──020.2.6-协程的结构化取消.mp4 87.92M | ├──021.2.7-不配合取消:NonCancellable.mp4 104.36M | ├──022.2.8-协程的结构化异常管理.mp4 168.29M | ├──023.2.9-Coroutine Exception Handle.mp4 44.29M | ├──024.2.10-异常的结构化管理的本质.mp4 124.40M | ├──025.2.11-async() 对异常的处理.mp4 68.55M | └──026.2.12-Supervisor Job.mp4 40.08M ├──3-CoroutineScope-Context | ├──027.3.1-Coroutine Scope _ -Context.mp4 45.53M | ├──028.3.2-GlobalScope.mp4 38.66M | ├──029.3.3-从挂起函数里获取 Coroutine Context.mp4 31.78M | ├──030.3.4-coroutine Scope() 和 superv.mp4 116.66M | ├──031.3.5-再谈 withContext().mp4 44.16M | ├──032.3.6-Coroutine Name.mp4 12.65M | ├──033.3.7-Coroutine Context的加减和get().mp4 90.20M | └──034.3.8-自定义 Coroutine Context.mp4 17.91M ├──4-Channel和 Flow | ├──035.4.1-Channel 和 Flow 简介与对比.mp4 23.18M | ├──036.4.2-用 produce() 来提供跨协程的事件流.mp4 68.66M | ├──037.4.3-Channel 的工作模式详解.mp4 77.59M | ├──038.4.4-Channel API 详解.mp4 181.89M | ├──039.4.5-actor():把 SendChannel 暴露出来.mp4 26.78M | ├──040.4.6-Flow 的功能定位.mp4 133.36M | ├──041.4.7-Flow 的工作原理和应用场景.mp4 83.71M | ├──042.4.8-Flow 的创建.mp4 93.41M | ├──043.4.9-Flow 的收集.mp4 47.92M | ├──044.4.10-filter() 系列操作符.mp4 53.07M | ├──045.4.11-distinct UntilChanged().mp4 16.08M | ├──046.4.12-自定义 Flow 操作符.mp4 30.98M | ├──047.4.13-timeout、sample、debounce().mp4 71.52M | ├──048.4.14-drop()、take() 系列操作符.mp4 16.03M | ├──049.4.15-map() 系列操作符.mp4 38.67M | ├──050.4.16-transform() 系列操作符.mp4 37.62M | ├──051.4.17-withIndex() 操作符.mp4 9.31M | ├──052.4.18-reduce()、fold() 系列操作符.mp4 82.36M | ├──053.4.19-onEach() 操作符.mp4 15.31M | ├──054.4.20-chunked() 操作符.mp4 6.72M | ├──055.4.21-try_catch 和 Flow 的异常可见性.mp4 138.97M | ├──056.4.22-catch() 操作符.mp4 79.60M | ├──057.4.23-retry() 和 retryWhen() 操作符.mp4 35.36M | ├──058.4.24-onStart() 等全流程监听系列操作符.mp4 25.32M | ├──059.4.25-flowOn() 操作符.mp4 99.52M | ├──060.4.26-buffer() 系列操作符.mp4 76.37M | ├──061.4.27-多个 Flow 的合并.mp4 80.33M | ├──062.4.29-SharedFlow 的效果和适用场景.mp4 120.42M | ├──063.4.30-shareIn() 操作符.mp4 91.88M | ├──064.4.31-Mutable Shared Flow.mp4 74.55M | └──065.4.32-StateFlow.mp4 38.52M └──5-协作、互斥锁和共享变量 | ├──066.5.1-协程间的协作和等待.mp4 32.99M | ├──067.5.2-select():先到先得.mp4 28.23M | ├──068.5.3-互斥锁和共享变量.mp4 154.95M | └──069.5.4-ThreadLocal.mp4 54.37M






