首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin Vocabulary | 揭秘协程的 suspend 修饰符

Kotlin 协程把 suspend 修饰符引入到了我们 Android 开发者的日常开发。您是否好奇它的底层工作原理呢?编译器是如何转换我们的代码,使其能够挂起和恢复协程操作的呢?...本文概要: Kotlin 编译器将会为每个挂起函数创建一个状态机,这个状态机将为我们管理协程的操作!...此时,编译器只需要添加如何在状态之间切换的信息。 首先需要知道的是: 函数是第一次调用函数已经从前一个状态恢复。...下面我们来看看编译器生成了什么: when 语句的参数是 LoginUserStateMachine 实例内的 label; 每一次处理新的状态时,为了防止函数被挂起时运行失败,都会进行一次检查; 在调用一个挂起函数...您将在下面代码中所见,它将调用 LoginUserStateMachine 存储的 cont 变量的 resume 函数: /* Copyright 2019 Google LLC.

2.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

不服来战,看Kotlin如何完爆Java

对于函数式编程,没有本地的支持:在Java,有Stream API (再说一次,它支持从API 24开始的Android),但是它在语言中的集成类似于Optional;它不存在于与原始类型相关联的对象...函数式编程:在Kotlin,我们找到了本地支持来处理像Streams这样的集合和数据集。...我们可以在一个collection中直接调用 .flatMap {}或者.filter {}、.map {}等等。类型的推断使得使用Lambdas变得特别容易。...Lambdas和高阶函数:在Kotlin函数是一级公民的事实已经完成。我们可以定义接收其他函数作为参数的函数。...Binding of views:这是一个具体的Android问题,Jetbrains为我们提供了Kotlin Android扩展;一个官方的支持库通过一个gradle的插件来简化这个问题(以及其他一些问题

1K50

Gradle Kotlin DSL指南

使用Gradle插件一章解释了如何在根项目构建脚本声明一个版本的插件,然后将它们应用到相应子项目的构建脚本。下面是一个使用三个子项目和三个插件的方法示例。...要从Groovy调用Kotlin扩展函数,将其作为静态函数调用,并将接收方作为第一个参数传递: 从Groovy调用Kotlin扩展 TheTargetTypeKt.kotlinExtensionFunction...要从Kotlin调用Groovy扩展方法,可以采用相同的方法:将其作为静态函数调用,将接收方作为第一个参数传递。...换句话说,对于任何给定的方法,在Groovy只能使用其中一种。 从Groovy调用Kotlin调用具有来自Groovy的命名参数的Kotlin函数,只需使用带有位置参数的普通方法调用。...要从Groovy调用具有默认参数的Kotlin函数,请始终传递所有函数参数的值 从Kotlin给Groovy打电话 要从Kotlin调用一个带命名参数的Groovy函数,需要传递一个Map<String

9.9K20

ApacheCN 安卓译文集 20211225 更新

Kotlin 安卓开发 零、前言 一、开始你的 Kotlin 冒险 二、基础 三、玩转函数 四、类和对象 五、作为一等公民的函数 六、泛型是你的朋友 七、扩展函数和属性 八、委托 九、制作您的漫威画廊应用...二十五、构建简单的图片库应用 二十六、使用导航抽屉和片段的高级 UI 二十七、安卓数据库 二十八、临别赠言 Kotlin 安卓编程初学者手册 零、前言 一、安卓和 Kotlin 入门 二、Kotlin...决策和循环 九、Kotlin 函数 十、面向对象编程 十一、Kotlin 的继承 十二、将我们的 Kotlin 连接到用户界面和可空性 十三、让安卓小部件栩栩生 十四、安卓对话窗口 十五、处理数据和生成随机数...二十五、带分页和滑动的高级用户界面 二十六、带有导航抽屉和片段的高级用户界面 二十七、安卓数据库 二十八、临别赠言 如何使用 Kotlin 构建安卓应用 零、前言 一、创建您的第一个应用 二、构建用户屏幕流...通过构建安卓应用学习 Kotlin 零、前言 一、为安卓开发做准备 二、为 Kotlin 配置您的环境 三、数据类型、变量和常量 四、类和对象 五、类型检查和空安全 六、函数和 Lambdas 七、开发基于位置的警报

7.1K20

Kotlin学习日志(四)函数

,要是函数不存在返回参数,也就是Java的返回void,Java中使用void表示不存在返回参数,而Kotlin的返回参数是一定存在的,即使开发者不声明任何返回参数,Kotlin函数也会默认返回一个Unit...我这一顿操作的意义何在呢?不是说默认参数吗?请听我慢慢道来,Kotlin引入了默认参数的概念,允许在定义函数时直接指定输入参数的默认值。...,Kotlin又引进了命名函数的概念,说的是调用函数时可以指定某个参数的名称及其数值,格式“参数名=参数值”,演示代码如下: ?...定义泛型函数时,需要在函数名称前面添加“”,表示以T声明的参数(包括输入参数和输出参数),其参数类型必须在函数调用时指定,代码示例如下: //Kotlin允许定义全局函数,即函数可在单独的kt文件定义...,内联函数在编译的时候回在调用处把该函数的内部代码直接复制一份,调用多少次复制多少份,而非普通函数那样仅仅提供一个函数的访问地址。

1.8K10

Google 推荐在 MVVM 架构中使用 Kotlin Flow

Kotlin Flow 是什么? Kotlin Flow 解决了什么问题? Kotlin Flow 如何在 MVVM 中使用?...Google 推荐在 MVVM 使用 Kotlin Flow Google 推荐在 MVVM 中使用 Kotlin Flow我相信如今几乎所有的 Android 开发者至少都听过 MVVM 架构,在...map 等等 Flow 是对 Kotlin 协程的扩展,让我们可以像运行同步代码一样运行异步代码,使得代码更加简洁,提高了代码的可读性 易于做单元测试 Kotlin Flow 如何在 MVVM 中使用...liveData{ ... } 的封装 asLiveData 是 Flow 的扩展函数,返回值是一个 LiveData liveData{ ... } 协程构造方法提供了一个协程代码块,在 liveData...,一个是不可变的,在 Activity 或者 Fragment 调用对外暴露不可变的 LiveData 即可,如下所示: // 方法一 mViewModel.pokemon.observe(this,

4.1K20

Android协程的7个必要知识点

上下文与调度器: 理解协程上下文的概念,包括调度器(Dispatcher)的作用,如何在不同的线程上执行协程代码。 挂起函数: 掌握挂起函数的概念,以及如何在协程调用和编写挂起函数。...协程间通信: 掌握协程间通信的方法,使用通道(Channel)进行数据交换和协程间的协作。 协程在UI线程的使用: 学会在Android应用中使用协程来处理UI操作,避免阻塞主线程。...协程的基本语法 在Kotlin,使用launch函数创建和启动协程,它返回一个Job实例,代表了协程的生命周期。协程代码块位于launch函数的大括号内。...下面将详细介绍挂起函数的概念,以及如何在协程调用和编写挂起函数,并学会处理异常和错误。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 在协程调用挂起函数 在协程内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数

45641

使用协程和 Flow 简化 API 设计

如果您是库作者,您也许希望用户在使用 Kotlin 协程与 Flow 时可以更加轻松地调用您基于 Java 或回调的 API。...Android 专用 API 对于 Jetpack 库或 Android 平台 API,您可以参阅 Jetpack KTX 库 列表。...在 Kotlin ,您可以简单地使用协程调用回调,但前提是您必须创建您自己的适配器。 创建您自己的适配器 如果没有找到适合您用例的适配器,更直接的做法是自己编写适配器。...(): Location 由于这是一个一次性异步操作,我们使用 suspendCancellableCoroutine 函数: 一个用于从协程库创建挂起函数的底层构建块。...callbackFlow 的 lambda 表达式的内部处于一个协程的上下文中,这意味着它可以调用挂起函数

1.6K20

kotlin-android-extensions插件也被废弃了?扶我起来

kotlin-android-extensions插件可能算得上是我最喜欢的一个KotlinAndroid上的特性了。...findViewById()函数去获取控件的实例,而是直接调用该控件在xml定义的id名称,就能够设置其显示的内容了。...在这个函数首先会尝试从一个HashMap获取传入的资源id参数所对应的控件实例缓存,如果还没有缓存的话,就调用findViewById()函数来查找控件实例,并写入HashMap缓存当中。...接下来就更加简单了,调用Binding类的getRoot()函数可以得到activity_main.xml根元素的实例,调用getTextView()函数可以获得id为textView的元素实例。...在onCreate()函数,我们调用TitlebarBinding.bind()函数,让titlebar.xml布局和activity_main.xml布局能够关联起来。

2.7K31

Kotlin开发的一些实用小技巧总结

懒加载也是更有效率的内存,因为我们只需要调用资源才能将资源加载到内存。...invoke(this) 16. with 函数 with 是一个非常有用的函数,它包含在 Kotlin 的标准库。它接收一个对象和一个扩展函数作为它的参数,然后使这个对象扩展这个函数。...这表示所有我们在括号编写的代码都是作为对象(第一个参数) 的一个扩展函数,我们可以就像作为 this 一样使用所有它的 public 方法和属性。...有一些解决方案, Butterknife 库,可以节省很多代码,但是 Kotlin 采取另一个步骤,允许您从一个导入的布局导入对视图的所有引用。 例如,这个 XML 布局: <?...apply 可以避免创建 builder 的方式来使用,因为对象调用函数可以根据自己的需要来初始化自己,然后 apply 函数会返回它同一个对象: user = User().apply { firstName

1.1K10

在Java 安全使用接口引用

作为Android 开发人员,Java 就像我们的母语一样,但Android 世界是多元化的,并不是只有Java 才能用来写Android 程序,Kotlin 和Groovy 同样优秀,并且有着大量的粉丝...可惜的是Java 并没有提供这种操作符,所以本文就和大家聊聊如何在Java 取代繁琐的非空判断。...在Android 开发我们经常会持有接口的引用,或注册某个事件的监听,系统服务的通知,点击事件的回调等,虽不胜枚举,但大部分监听都需要我们去实现一个接口,因此我们就拿注册回调监听来举例: private...AbstractCallSite#call(Object) 之后是一个漫长的调用过程,这其中包括一系列重载函数调用和对接口引用callback 的代理等,最终得益于Groovy 的元编程能力,在标准GroovyObject...在Groovy 和Kotlin 的原理是基本相同的。 因此可以得出结论:编译器将?. 操作符编译成亦或在框架内部调用与if (callback != null) {} 等同效果的代码片段

1.7K20

在Java 安全使用接口引用

作为Android 开发人员,Java 就像我们的母语一样,但Android 世界是多元化的,并不是只有Java 才能用来写Android 程序,Kotlin 和Groovy 同样优秀,并且有着大量的粉丝...可惜的是Java 并没有提供这种操作符,所以本文就和大家聊聊如何在Java 构造出同样的效果。 由于源码分析与调用原理不属于本文的范畴,只提供解读思路,所以本文不涉及详细的源码解读,仅点到为止。...在Android 开发我们经常会持有接口的引用,或者注册事件的监听,诸如系统服务的通知,点击事件的回调等,虽不胜枚举,但大部分监听都需要我们去实现一个接口,因此我们今天就拿注册一个回调监听举例:...AbstractCallSite#call(Object) 之后是一个漫长的调用过程,这其中包括一系列重载函数调用和对接口引用callback 的代理等,最终得益于Groovy 的元编程能力,在标准GroovyObject...和Kotlin 是如出一辙的,这也恰好印证了本段开头的猜想: 编译器将?. 操作符编译成亦或在框架内部调用与if (callback != null) {} 等同效果的代码片段

1.8K20

Android:这是一份全面 & 详细的Kotlin入门学习指南

配置使用 下面将讲解如何在Android Studio配置Kotlin进行使用。 3.1 Android Studio3.0前的版本 主要分为3个步骤,完成3个步骤即可完成Kotlin的配置。...// Kotlin没有new关键字,所以直接创建类的实例: User() 对于构造函数Kotlin类可有一个主构造函数 & 多个次构造函数,下面将详细说明。...(注:一个模块 = 编译在一起的一套 Kotlin 文件: 一个 IntelliJ IDEA 模块; 一个 Maven 项目; 一个 Gradle 源集; 一次 <kotlinc> Ant 任务执行所编译的一套文件...& 有返回值,那么可省略函数体的大括号,变成单表达式函数 fun add(a: Int, b: Int) = a + b; // 调用函数:假设一个类中有一个foo的函数方法 User().foo(...) // :String类型变量不能容纳null // 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?

2.8K20

10 年 Android 开发者经验分享:如何从 0 到 1 开启职业生涯

这意味着,你能在网上( StackOverflow.com 上)找到的任何代码片段都可以转换为 Kotlin。...除了 Java 和 Kotlin 之外,你也可以选择其他语言, C#、JavaScript 等。在本文的后半部分,我们会简要地讨论一下。 2 如何学习 Anroid 开发?...一旦你对如何创建自己的 Android 应用有了一个大概的想法,就可以开始构建了。 这是目前为止最好的学习方式: 它将提供大量你在今后的日常工作需要的技能。...最后,同样重要的是,看看 Android 官方的 Twitter 账户(@AndroidDev)。它非常活跃,经常会分享大量有用的信息。 5 如何在求职时脱颖而出?...在 GitHub 上创建一个账号,并为开源软件做贡献。 通过博客和社交媒体分享在线学习经验。上述几条有个很大的好处,就是没有时间限制,可以在你的整个职业生涯增加你的信誉。

1.1K30

Carson带你学Android:这是一份全面 & 详细的Kotlin入门学习指南

配置使用 下面将讲解如何在Android Studio配置Kotlin进行使用。 3.1 Android Studio3.0前的版本 主要分为3个步骤,完成3个步骤即可完成Kotlin的配置。...// Kotlin没有new关键字,所以直接创建类的实例: User() 对于构造函数Kotlin类可有一个主构造函数 & 多个次构造函数,下面将详细说明。...(注:一个模块 = 编译在一起的一套 Kotlin 文件: 一个 IntelliJ IDEA 模块; 一个 Maven 项目; 一个 Gradle 源集; 一次 <kotlinc> Ant 任务执行所编译的一套文件...& 有返回值,那么可省略函数体的大括号,变成单表达式函数 fun add(a: Int, b: Int) = a + b; // 调用函数:假设一个类中有一个foo的函数方法 User().foo(...) // :String类型变量不能容纳null // 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?

2.1K20

31 天,从浅到深轻松学习 Kotlin

Kotlin 的 When 表达几乎可以匹配任何东西。字面值,枚举,数字范围。您甚至可以调用任意函数!...第二周 Day 8:简单的 bundle 准备去通过简洁的方式去创建 bundle,不调用 putString,putInt,或它们的 20 个方法的任何一个。...在函数中指定默认参数值。使用命名参数使代码更具可读性。 Day 13:从 Java 编程语言调用 Kotlin 在同一个项目中使用 Kotlin 和 Java?您有没有顶级功能或属性的课程?...使用 Android KTX 传递一个 Pair 创建 ContentValues。 Day 23:DSLs 特定于域的语言可以通过使用类型安全的构建器来完成。...序列是迭代器的表亲,一次只能懒散地产生一个值。这在使用 map 和 fifter 时非常重要 - 它们将创建序列,而不是为每一步都复制列表! 您可以从列表创建序列或指定下一个功能。

2.2K30

快速进阶 Kotlin Flow:掌握异步开发技巧

Android 应用开发,异步编程是不可避免的,而 Kotlin Flow 是一个强大的库,能够使异步操作更加优雅和易于管理。...通过调用 flow { ... },你可以定义一个发射器,并使用 emit() 函数来发射数据。...通过调用 collect 函数,你可以订阅并处理发射的数据。...协程允许在函数执行过程挂起,等待某些条件满足后恢复执行。Flow 利用了这一特性来实现数据流的处理。 在 Flow 内部,数据流被建模为一系列的悬挂函数调用。...如果内存占用是一个问题,可以选择 conflate 策略。如果关心最新的数据,可以选择 collectLatest 策略。 取消操作 在异步操作,取消是一个重要的考虑因素。

76730
领券