阿里P7大佬教你 Kotlin 协程(1) - 入门篇

[译] 2019 年的 Android 网络 —— Retrofit 与 Kotlin 协程 //Kotlin Coroutines implementation “org.jetbrains.kotlinx:kotlinx-coroutines-android:kotlinCoroutineVersion"implementation"org.jetbrains.kotlinx:kotlinx−coroutines−core:kotlinCoroutineVersion" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:k 阅读详情

破解 Kotlin 协程(1) - 入门篇

在这里插入图片描述

我之前写过一些协程的文章,很久以前了。那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求。

这次准备从协程用户(也就是程序员你我他啦)的角度来写一下,希望对大家能有帮助。

2. 需求确认

在开始讲解协程之前,我们需要先确认几件事儿:

  1. 你用过线程对吧?
  2. 你写过回调对吧?
  3. 你用过 RxJava 类似的框架吗?

看下你的答案:

  • 如果上面的问题的回答都是 “Yes”,那么太好了,这篇文章非常适合你,因为你已经意识到回调有多么可怕,并且找到了解决方案;
  • 如果前两个是 “Yes”,没问题,至少你已经开始用回调了,你是协程潜在的用户;
  • 如果只有第一个是 “Yes”,那么,可能你刚刚开始学习线程,那你还是先打好基础再来吧~

3. 一个常规例子

我们通过 Retrofit 发送一个网络请求,其中接口如下:

interface GitHubServiceApi {
    @GET("users/{login}")
    fun getUser(@Path("login") login: String): Call<User>
}

data class User(val id: String, val name: String, val url: String)

Retrofit 初始化如下:

val gitHubServiceApi by lazy {
    val retrofit = retrofit2.Retrofit.Builder()
            .baseUrl("https://api.github.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    retrofit.create(GitHubServiceApi::class.java)
}

那么我们请求网络时:

gitHubServiceApi.getUser("bennyhuo").enqueue(object : Callback<User> {
    override fun onFailure(call: Call<User>, t: Throwable) {
        handler.post { showError(t) }
    }

    override fun onResponse(call: Call<User>, response: Response<User>) {
        handler.post { response.body()?.let(::showUser) ?: showError(NullPointerException()) }
    }
})

请求结果回来之后,我们切换线程到 UI 线程来展示结果。这类代码大量存在于我们的逻辑当中,它有什么问题呢?

  • 通过 Lambda 表达式,我们让线程切换变得不是那么明显,但它仍然存在,一旦开发者出现遗漏,这里就会出现问题
  • 回调嵌套了两层,看上去倒也没什么,但真实的开发环境中逻辑一定比这个复杂的多,例如登录失败的重试
  • 重复或者分散的异常处理逻辑,在请求失败时我们调用了一次 showError,在数据读取失败时我们又调用了一次,真实的开发环境中可能会有更多的重复

Kotlin 本身的语法已经让这段代码看上去好很多了,如果用 Java 写的话,你的直觉都会告诉你:你在写 Bug。

如果你不是 Android 开发者,那么你可能不知道 handler 是什么东西,没关系,你可以替换为 SwingUtilities.invokeLater{ ... } (Java Swing),或者 setTimeout({ ... }, 0) (Js) 等等。

4. 改造成协程

你当然可以改造成 RxJava 的风格,但 RxJava 比协程抽象多了,因为除非你熟练使用那些 operator,不然你根本不知道它在干嘛(试想一下 retryWhen)。协程就不一样了,毕竟编译器加持,它可以很简洁的表达出代码的逻辑,不要想它背后的实现逻辑,它的运行结果就是你直觉告诉你的那样。

对于 Retrofit,改造成协程的写法,有两种,分别是通过 CallAdapter 和 suspend 函数。

4.1 CallAdapter 的方式

我们先来看看 CallAdapter 的方式,这个方式的本质是让接口的方法返回一个协程的 Job:

interface GitHubServiceApi {
    @GET("users/{login}")
    fun getUser(@Path("login") login: String): Deferred<User>
}

注意 Deferred 是 Job 的子接口。

那么我们需要为 Retrofit 添加对 Deferred 的支持,这需要用到开源库:

implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

构造 Retrofit 实例时添加:

val gitHubServiceApi by lazy {
    val retrofit = retrofit2.Retrofit.Builder()
            .baseUrl("https://api.github.com")
            .addConverterFactory(GsonConverterFactory.create())
            //添加对 Deferred 的支持
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .build()

    retrofit.create(GitHubServiceApi::class.java)
}

那么这时候我们发起请求就可以这么写了:

GlobalScope.launch(Dispatchers.Main) {
    try {
        showUser(gitHubServiceApi.getUser("bennyhuo").await())
    } catch (e: Exception) {
        showError(e)
    }
}

说明: Dispatchers.Main 在不同的平台上的实现不同,如果在 Android 上为 HandlerDispatcher,在 Java Swing 上为 SwingDispatcher 等等。

首先我们通过 launch 启动了一个协程,这类似于我们启动一个线程,launch 的参数有三个,依次为协程上下文、协程启动模式、协程体:

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext, // 上下文
    start: CoroutineStart = CoroutineStart.DEFAULT,  // 启动模式
    block: suspend CoroutineScope.() -> Unit // 协程体
): Job 

启动模式不是一个很复杂的概念,不过我们暂且不管,默认直接允许调度执行。

上下文可以有很多作用,包括携带参数,拦截协程执行等等,多数情况下我们不需要自己去实现上下文,只需要使用现成的就好。上下文有一个重要的作用就是线程切换,Dispatchers.Main 就是一个官方提供的上下文,它可以确保 launch 启动的协程体运行在 UI 线程当中(除非你自己在 launch 的协程体内部进行线程切换、或者启动运行在其他有线程切换能力的上下文的协程)。

换句话说,在例子当中整个 launch 内部你看到的代码都是运行在 UI 线程的,尽管 getUser 在执行的时候确实切换了线程,但返回结果的时候会再次切回来。这看上去有些费解,因为直觉告诉我们,getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么 await 不会阻塞 UI 线程吗?

答案是:不会。当然不会,不然那 Deferred 与 Future 又有什么区别呢?这里 await 就很可疑了,因为它实际上是一个 suspend 函数,这个函数只能在协程体或者其他 suspend 函数内部被调用,它就像是回调的语法糖一样,它通过一个叫 Continuation 的接口的实例来返回结果:

@SinceKotlin("1.3")
public interface Continuation<in T> {
    public val context: CoroutineContext
    public fun resumeWith(result: Result<T>)
}

1.3 的源码其实并不是很直接,尽管我们可以再看下 Result 的源码,但我不想这么做。更容易理解的是之前版本的源码:

@SinceKotlin("1.1")
public interface Continuation<in T> {
    public val context: CoroutineContext
    public fun resume(value: T)
    public fun resumeWithException(exception: Throwable)
}

相信大家一下就能明白,这其实就是个回调嘛。如果还不明白,那就对比下 Retrofit 的 Callback:

public interface Callback<T> {
  void onResponse(Call<T> call, Response<T> response);
  void onFailure(Call<T> call, Throwable t);
}

有结果正常返回的时候,Continuation 调用 resume 返回结果,否则调用 resumeWithException 来抛出异常,简直与 Callback 一模一样。

所以这时候你应该明白,这段代码的执行流程本质上是一个异步回调:

GlobalScope.launch(Dispatchers.Main) {
    try {
        //showUser 在 await 的 Continuation 的回调函数调用后执行
        showUser(gitHubServiceApi.getUser("bennyhuo").await())
    } catch (e: Exception) {
        showError(e)
    }
}

而代码之所以可以看起来是同步的,那就是编译器的黑魔法了,你当然也可以叫它“语法糖”。

这时候也许大家还是有问题:我并没有看到 Continuation 啊,没错,这正是我们前面说的编译器黑魔法了,在 Java 虚拟机上,await 这个方法的签名其实并不像我们看到的那样:

public suspend fun await(): T

它真实的签名其实是:

kotlinx/coroutines/Deferred.await (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;

即接收一个 Continuation 实例,返回 Object 的这么个函数,所以前面的代码我们可以大致理解为:

//注意以下不是正确的代码,仅供大家理解协程使用
GlobalScope.launch(Dispatchers.Main) {
    gitHubServiceApi.getUser("bennyhuo").await(object: Continuation<User>{
            override fun resume(value: User) {
                showUser(value)
            }
            override fun resumeWithException(exception: Throwable){
                showError(exception)
            }
    })
}

而在 await 当中,大致就是:

//注意以下并不是真实的实现,仅供大家理解协程使用
fun await(continuation: Continuation<User>): Any {
    ... // 切到非 UI 线程中执行,等待结果返回
    try {
        val user = ...
        handler.post{ continuation.resume(user) }
    } catch(e: Exception) {
        handler.post{ continuation.resumeWithException(e) }
    }
}

这样的回调大家一看就能明白。讲了这么多,请大家记住一点:从执行机制上来讲,协程跟回调没有什么本质的区别。

4.2 suspend 函数的方式

suspend 函数是 Kotlin 编译器对协程支持的唯一的黑魔法(表面上的,还有其他的我们后面讲原理的时候再说)了,我们前面已经通过 Deferred 的 await 方法对它有了个大概的了解,我们再来看看 Retrofit 当中它还可以怎么用。

Retrofit 当前的 release 版本是 2.5.0,还不支持 suspend 函数。因此想要尝试下面的代码,需要最新的 Retrofit 源码的支持;当然,也许你看到这篇文章的时候,Retrofit 的新版本已经支持这一项特性了呢。

首先我们修改接口方法:

@GET("users/{login}")
suspend fun getUser(@Path("login") login: String): User

这种情况 Retrofit 会根据接口方法的声明来构造 Continuation,并且在内部封装了 Call 的异步请求(使用 enqueue),进而得到 User 实例,具体原理后面我们有机会再介绍。使用方法如下:

GlobalScope.launch {
    try {
        showUser(gitHubServiceApi.getUser("bennyhuo"))
    } catch (e: Exception) {
        showError(e)
    }
}

它的执行流程与 Deferred.await 类似,我们就不再详细分析了。

5. 协程到底是什么

好,坚持读到这里的朋友们,你们一定是异步代码的“受害者”,你们肯定遇到过“回调地狱”,它让你的代码可读性急剧降低;也写过大量复杂的异步逻辑处理、异常处理,这让你的代码重复逻辑增加;因为回调的存在,还得经常处理线程切换,这似乎并不是一件难事,但随着代码体量的增加,它会让你抓狂,线上上报的异常因线程使用不当导致的可不在少数。

而协程可以帮你优雅的处理掉这些。

协程本身是一个脱离语言实现的概念,我们“很严谨”(哈哈)的给出维基百科的定义:

Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed. Coroutines are well-suited for implementing familiar program components such as cooperative tasks, exceptions, event loops, iterators, infinite lists and pipes.

简单来说就是,协程是一种非抢占式或者说协作式的计算机程序并发调度的实现,程序可以主动挂起或者恢复执行。这里还是需要有点儿操作系统的知识的,我们在 Java 虚拟机上所认识到的线程大多数的实现是映射到内核的线程的,也就是说线程当中的代码逻辑在线程抢到 CPU 的时间片的时候才可以执行,否则就得歇着,当然这对于我们开发者来说是透明的;而经常听到所谓的协程更轻量的意思是,协程并不会映射成内核线程或者其他这么重的资源,它的调度在用户态就可以搞定,任务之间的调度并非抢占式,而是协作式的。

关于并发和并行:正因为 CPU 时间片足够小,因此即便一个单核的 CPU,也可以给我们营造多任务同时运行的假象,这就是所谓的“并发”。并行才是真正的同时运行。并发的话,更像是 Magic。

如果大家熟悉 Java 虚拟机的话,就想象一下 Thread 这个类到底是什么吧,为什么它的 run 方法会运行在另一个线程当中呢?谁负责执行这段代码的呢?显然,咋一看,Thread 其实是一个对象而已,run 方法里面包含了要执行的代码——仅此而已。协程也是如此,如果你只是看标准库的 API,那么就太抽象了,但我们开篇交代了,学习协程不要上来去接触标准库,kotlinx.coroutines 框架才是我们用户应该关心的,而这个框架里面对应于 Thread 的概念就是 Job 了,大家可以看下它的定义:

public interface Job : CoroutineContext.Element {
    ...
    public val isActive: Boolean
    public val isCompleted: Boolean
    public val isCancelled: Boolean

    public fun start(): Boolean
    public fun cancel(cause: CancellationException? = null)
    public suspend fun join()
    ...
}

我们再来看看 Thread 的定义:

public class Thread implements Runnable {
    ...    
    public final native boolean isAlive();
    public synchronized void start() { ... }
    @Deprecated
    public final void stop() { ... }
    public final void join() throws InterruptedException  { ... }
    ...
}

这里我们非常贴心的省略了一些注释和不太相关的接口。我们发现,Thread 与 Job 基本上功能一致,它们都承载了一段代码逻辑(前者通过 run 方法,后者通过构造协程用到的 Lambda 或者函数),也都包含了这段代码的运行状态。

而真正调度时二者才有了本质的差异,具体怎么调度,我们只需要知道调度结果就能很好的使用它们了。

6. 小结

我们先通过例子来引入,从大家最熟悉的代码到协程的例子开始,演化到协程的写法,让大家首先能从感性上对协程有个认识,最后我们给出了协程的定义,也告诉大家协程究竟能做什么。

这篇文章没有追求什么内部原理,只是企图让大家对协程怎么用有个第一印象。如果大家仍然感觉到迷惑,不怕,后面我将再用几篇文章从例子入手来带着大家分析协程的运行,而原理的分析,会放到大家能够熟练掌握协程之后再来探讨。

需要更多的Kotlin学习资料可以扫码免费领取!

《史上最详Android版kotlin协程入门进阶实战 》

第一章 Kotlin协程的基础介绍

​ ● 协程是什么

​ ● 什么是Job 、Deferred 、协程作用域

​ ● Kotlin协程的基础用法

img

第二章 kotlin协程的关键知识点初步讲解

​ ● 协程调度器

​ ● 协程上下文

​ ● 协程启动模式

​ ● 协程作用域

​ ● 挂起函数

img

第三章 kotlin协程的异常处理

​ ● 协程异常的产生流程

​ ● 协程的异常处理

img

第四章 kotlin协程在Android中的基础应用

Android蓝牙Mesh组网实战:从零搭建智能灯光控制系统(附完整代码) 本文详细介绍了基于Android平台开发蓝牙Mesh智能灯光控制系统的完整实战流程。从环境搭建、核心概念解析,到设备扫描配网、网络初始化、模型配置与消息通信,提供了完整的代码实现和调试技巧。重点讲解了如何使用开源Mesh库实现设备发现、分组控制、场景管理等核心功能,并分享了实际项目中遇到的典型问题与解决方案。 阅读详情

相关推荐

Altera Cyclone4 EP4CE15F17C8核心板硬件设计避坑指南(附AD09工程文件)

本文深入解析Altera Cyclone4 EP4CE15F17C8核心板硬件设计中的关键问题与解决方案,涵盖电源架构优化、信号完整性处理、热设计及生产调试要点。特别提供经过验证的AD09工程文件,帮助开发者规避常见设计陷阱,提升FPGA项目的成功率与可靠性。

weixin_29159441的博客 298

Retrofit+Kotlin Coroutine重构Android网络框架

前言 Kotlin的Coroutine 可以使异步编程的代码更优雅,可以去除传统的异步编程中的Callback,使得代码看起来就是它想表达的直观的逻辑。使用异步编程最多的地方就是网络请求,所以如果能将Coroutine与Retrofit结合起来,去除Retrofit中的Callback。那么我们的网络请求的代码将会变的非常的易读。 Kotlin Coroutine 简介 Kotlin coroutines let you convert callback-based code to sequential

taotao110120119的专栏 2931

从数据到图片:手把手构建FMCW雷达人体行为识别数据集(行走、跌倒、喝水等6类动作)

本文详细解析了如何利用FMCW雷达构建人体行为识别数据集,涵盖行走、跌倒、喝水等6类动作。通过多普勒特征可视化、图像标准化处理和自动化流水线设计,将原始雷达信号转化为高质量时频图像数据集,为智能家居和健康监护等应用提供可靠数据支持。

weixin_30706691的博客 385

[译] 2024 年的 Android 网络 —— Retrofit 与 Kotlin 协程

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

2301_76268112的博客 1184

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 404

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

在kotlin协程中使用自定义CallAdapter处理错误

这时候就应该翻一下源码了,在example有个,路径在。我们来仿写一下,最关键的点在实现自己的 Call 类的时候,对callback 的处理。第一步,创建密闭类,来表示不同的状态,这里暂且定义了三种情况Success:HTTP状态码在[200,300)这个区间NetError:HTTP状态码不在[200,300)这个区间UnknownError:其他错误。

m0_64365896的博客 906

HTPA 32x32d热成像传感器数据读取与校准全流程解析

本文详细解析了HTPA 32x32d热成像传感器的数据读取与校准全流程。从寄存器配置、原始数据采集,到核心的五大校准步骤(包括热量、电子偏移、电压、灵敏度补偿及温度转换),并涵盖像素重组、坏点修复及图像后处理,为开发者替代或升级MLX90640提供了完整、实用的操作指南。

weixin_29190169的博客 611

什么是TM的kotlin协程?就是靠 恢复和挂起,像同步一样写异步代码

接口方法被标记为suspend,这意味着它们是挂起函数,可以在协程中异步执行// 用户详细信息数据类// 用户文章数据类// 用户详细信息和文章的数据类// API接口定义。

1 872

主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效

通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了“串行总线控制器总是感叹号”的关联问题。正好办公室电脑都装有teamviwer常用来远程办公(在家偷懒)。所以通过远程发现电脑室可以运行的。并在控制面板发现:通用串行总线控制器总是感叹号,插入外设时USB无反应。如图:​ 并且右键选中其中一个,点击最后一个选项:“属性” 可以发现“设备状态”中会提示“由...

xiao_bai_0_0的博客 2万+

【论文+代码】ZS-N2N实现小样本零网络图像去噪

本文涵盖论文原文讲解与代码复现。

weixin_46287760的博客 4002

阿里P7大佬教你Kotlin协程实现原理:挂起与恢复

P7大佬教你Kotlin协程实现原理:挂起与恢复

Android_XG的博客 703

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

阿里P7大佬教你破解 Kotlin 协程(6) - 协程挂起篇

​ ● 协程是什么​ ● 什么是Job 、Deferred 、协程作用域​ ● Kotlin协程的基础用法。

Android_XG的博客 268

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

阿里P7大佬教你破解 Kotlin 协程(3) - 协程调度篇

有了前面的基础,我们对于调度器的介绍就变得水到渠成了。......它本身是协程上下文的子类,同时实现了拦截器的接口,dispatch方法会在拦截器的方法中调用,进而实现协程的调度。所以如果我们想要实现自己的调度器,继承这个类就可以了,不过通常我们都用现成的,它们定义在这个类的定义涉及到了 Kotlin MPP 的支持,因此你在 Jvm 版本当中还会看到,在 js 和 native 当中就只有前面提到的这三个了(对 Jvm 好偏心呐)。JvmJsNativeDefault线程池。

Android_XG的博客 371

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

阿里P7大佬教你Kotlin 协程(2):协程启动篇

现在

Android_XG的博客 266

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

阿里P7大佬教你破解 Kotlin 协程(5) - 协程取消篇

​ ● 协程是什么​ ● 什么是Job 、Deferred 、协程作用域​ ● Kotlin协程的基础用法。

Android_XG的博客 535

阿里P7大佬教你破解 Kotlin 协程(4) - 异常处理篇

​ ● 协程是什么​ ● 什么是Job 、Deferred 、协程作用域​ ● Kotlin协程的基础用法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

Android_XG的博客 491

阿里P8大佬带你真正理解一波Kotlin协程

1概述 目录 前言 Kotlin协程,现在已经成为了面试甚至是工作中一个非常火的东西。 本人在刚开始了解Kotlin协程的时候,断断续续看了网上不少文章,用长篇大论把Kotlin协程描述的非常玄乎,但是看完后还是依然云里雾里,所以决定来写一篇关于协程的文章,希望能够帮助大家能够更快的上手Kotlin协程. 注意:如果没有特殊提及,文中所有“协程”均代表“Kotlin协程” 2为什么要学习Kotlin协程?(官方版) 现在Android技术栈上的新东西层出不穷,kotlin、jetpa.

CHAMPION8888的博客 561

kotlin 协程基础,阿里p8 hr面试

CoroutineContext是一系列元素的集合,主要的元素是代表协程的Job,此外还有协程的dispatcher等(Job、Dispatchers与CoroutineName都实现了Element接口)。CoroutineScope封装了CoroutineContext:针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。

2301_79098332的博客 902

阿里P7大佬教你破解 Kotlin 协程(7) - 序列生成器篇

​ ● 协程是什么​ ● 什么是Job 、Deferred 、协程作用域​ ● Kotlin协程的基础用法。

Android_XG的博客 211

2024年Android最全万字长文 - Kotlin 协程进阶,2024年最新字节跳动面试笔试

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,也可以分享给身边好友一起学习。一起互勉~网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84562143的博客 815

P7阿里大佬教你破解 Kotlin 协程(10) - Select 篇

在协程当中,Select 的语义与 Java NIO 或者 Unix 的 IO 多路复用类似,它的存在使得我们可以轻松实现 1 拖 N,实现哪个先来就处理哪个。尽管 Select 和 Channel 比起标准库的协程 API 已经更接近业务开发了,不过个人认为它们仍属于相对底层的 API 封装,在实践当中多数情况下也可以使用 Flow API 来解决。而这个 Flow API,完全就是响应式编程的协程版 API,我们简直可以照着 RxJava 来学习它,所以我们下一篇再见吧~~~,这样反而将问题复杂化了。

Android_XG的博客 183

Kotlin(九,阿里P7大牛亲自教你

| join() | 等待协程执行完毕 | | cancel() | 取消一个协程 | 协程的启动 public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job{ val new

m0_61418455的博客 220

kotlin语言,,阿里P7大牛亲自教你

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

VIP129370的博客 484

kotlin 协程基础,阿里P8架构师的Android大厂面试题总结

CoroutineScope.async与CoroutineScope.launch的区别在于,async方式返回Deferred,可以获取协程的执行结果。 3.5 coroutineScope 在其他协程或挂起函数内,可通过coroutineScope来创建一个CoroutineScope,并且会立即执行coroutineScope{}内新建的协程,如下所示: GlobalScope.launch { Log.d(“CoroutineTag”, “GlobalScope”) coroutineScope

m0_65511857的博客 622
上一篇: 在华为OD的程序员经验分享
下一篇: 寒冬之际,6年Android开发转入车载方向
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值