扔物线--Kotlin协程训练营2期-1
笔记仅做自己学习用,方便自己复习知识。若正好可以帮助到Viewer,万分欣喜~
若博客侵权,扔物线大大不允许放上面,麻烦告知
本文是扔物线Kotlin第二期协程训练营的第一篇文章
目录
一、Kotlin协程是什么
1. 协程是什么?
2. Kotlin的协程是什么?
二、Kotlin协程的优势
1. 流式的代码写法
2. 协程的额外天然优势:性能
三、suspend关键字
四、练习题
1. Kotlin的协程是什么?它有什么优势?为什么?
2. Kotlin 协程的 suspend 关键字有什么意义?
3. 如果不使用协程,让你自己实现一个和协程类似的框架,你认为难点在哪里?
一、Kotlin协程是什么
1. 协程是什么?
协程是一个广义的概念,在很多编程语言里都有协程的编程思想。协程是一种在程序中处理并发任务的方案,也是这种方案的一个组件。
协程和线程属于同一个层级的概念,是一种和线程不同的并发任务解决方案:一套系统(可以是操作系统,也可以是一种编程语言)可以选择不同的方案来处理并发任务,你可以使用线程,也可以使用协程。
2. Kotlin的协程是什么?
Kotlin的协程和广义的协程不是一种东西,Kotlin的协程(准确地说是Kotlin for JVM的协程)是一个线程框架。类似于Java提供的线程池Executor
二、Kotlin协程的优势
1. 流式的代码写法
考虑一种需求:通过网络加载一张图片,展示在页面上,再对图片进行处理后,再展示在界面上。
需求的流程: 1. 加载图片;2.展示原图;3.对图片进行处理;4.展示处理后的图片。
其中1、3步是IO操作,需要放在后天执行,而2、4属于UI操作,需要在主线程运行。
一般情况下我们会使用线程切换或使用回调,来实现,代码如下:
new Thread(new Runnable() {@Overridepublic void run() {getBitmapFromNet(); // 1.通过网络加载图片runOnUiThread(new Runnable() {@Overridepublic void run() {showBitmap1(); // 2.在界面上展示原图new Thread(new Runnable() {@Overridepublic void run() {dealWithBimap(); // 3.对原图进行处理(放缩、裁剪等)runOnUiThread(new Runnable() {@Overridepublic void run() {showBitmap2(); // 4.在界面上展示处理后的图}});}});}});}});
如果使用callback,最少也需要使用两次回调。
再来看看协程的写法:
init {GlobalScope.launch(Dispatchers.Main) {getBitmapFromNet() // 1.通过网络加载图片showBitmap1() // 2.在界面上展示原图dealWithBimap() // 3.对原图进行处理(放缩、裁剪等)showBitmap2() // 4.在界面上展示处理后的图}}suspend fun getBitmapFromNet(String url): Bitmap = withContext(Dispatchers.IO) {Bitmap bitmap = ...return@withContext bitmap}fun showBitmap1(Bitmap bitmap){}suspend fun dealWithBimap(Bitmap bitmap): Bitmap = withContext(Dispatchers.IO) {Bitmap bitmap = ...return@withContext bitmap}fun showBitmap2(Bitmap bitmap){}
看init里的代码,纳尼???IO操作的代码和UI操作的代码放在一起线性执行,这代码会把界面卡死的吧。再仔细看GlobalScope.launch(Dispatchers.Main)和withContext(Dispatchers.IO),以及函数前的suspend关键词。慢慢会发现,难道这个代码那么NB,可以把线程代码和主线程代码不用切换地一起写!!!是的,这就是Kotlin的协程,它会自动切换线程,将应该在线程中运行的代码放在线程里执行,应该在UI线程运行的代码还在UI线程运行。GlobalScope.launch(Dispatchers.Main)这里的Dispatchers.Main表示该代码块中的协程代码主要在主线程运行,当协程里运行的函数没有指定线程时,就会在主线程运行。如果在函数里加上withContext(Dispatchers.IO)和suspend关键词,就代表这个函数需要在IO线程运行。线程会自动切换。
这就是协程,流式的代码写法,佩服的五体投地...
写法总结:
a. 用launch来开启一段协程,一般需要指定Dispatchers.Main
b. 把需要在后头工作的函数,使用suspend关键词标记,并调用其他suspend函数(这里的withContext(Dispatchers.IO))来真正地切换线程
c. 按照一条线写下来,线程会自动切换
2. 协程的额外天然优势:性能
不知道你在工作中有没有遇见过这种情况:比如一个查询数据库的函数,查询的量不算大,也不算小。有时候就直接把它放在主线程执行了,在测试时发现没有卡顿主线程。但是这段代码如果在性能低下的手机上运行,就可能会造成几十毫秒的卡顿,导致丢帧。这样的情况,我们很难判断这个代码是否“耗时”,有时候一个不注意就放在了主线程运行。
但是,用协程就可以很好地解决这个问题,我们可以把所有的IO操作,数据操作代码都放在后台运行,协程可以在后台执行完任务后自动切回到主线程。保证耗时代码100%放在后台执行,就能解决这方面的性能问题。
三、suspend关键字
suspend并不是来切回线程的,实际的切换线程操作是由其他函数完成的,比如withContext。
suspend主要是起到标记和提醒的作用。标记这个代码需要在协程里执行。
四、练习题
1. Kotlin的协程是什么?它有什么优势?为什么?
它是Kotlin基于JVM的线程来实现的一个并发任务处理框架(或者方案)。
优势:用起来方便,不需要回调,用纯线程的方式就可以完成线程的切回。
所有耗时任务可以保证一定放在后台执行,从而提高软件性能。
2. Kotlin 协程的 suspend 关键字有什么意义?
语法层面:作为一个标记和提醒。通过报错来提醒调用者和编译器,这是一个耗时函数,需要放在后台执行。
编译器层面:辅助Kotlin编译器来把代码转换成JVM的字节码。
3. 如果不使用协程,让你自己实现一个和协程类似的框架,你认为难点在哪里?
在不使用回调的前提下完成线程切换;
在挂起函数执行完毕时,自动判断应该回到哪个线程。
第二篇文章讲解RxJava、Retorfit、Jetpack对协程的支持,以及协程的本质探秘
第二篇文章传送:https://blog.csdn.net/bluerheaven/article/details/106971483
扔物线--Kotlin协程训练营2期-1相关推荐
- 扔物线--Kotlin协程训练营2期-2
笔记仅做自己学习用,方便自己复习知识.若正好可以帮助到Viewer,万分欣喜~ 若博客侵权,扔物线大大不允许放上面,麻烦告知 本文是扔物线Kotlin第二期协程训练营的第二篇文章 没看过第一篇文章的可 ...
- 扔物线Kotlin讲解学习(一)----Kotlin的权限修饰符详解
Kotlin 中有四种可见性修饰符: public:公开,可见性最大,哪里都可以引用. private:私有,可见性最小,根据声明位置不同可分为类中可见和文件中可见. protected:保护,相当于 ...
- 扔物线第一次公开演讲 Kotlin 的协程,就在这周六
今天发这篇文,是有三件重要的事要大家讲: 之前转发过北京 GDG 的一篇文章,很多人应该都知道,本周六在北京有一场 Kotlin / everywhere 的技术大会,是由北京 GDG 社区与 Kot ...
- 扔物线 298 元协程集训课程,限时免费送!
Kotlin 的协程从一推出就受到大量的关注,国内外很多团队纷纷尝试,但真正能完全正确地使用协程的人并不多,甚至有很多人和团队到现在还学不会怎么使用协程. 然而,协程却是每个已经在使用 Kotlin ...
- 谷歌开发者大会扔物线演讲原稿整理:Jetpack Compose
大家好,我是扔物线朱凯.前两天,我在 GDG DevFest 2020 的 Android Day 做了一次面向全国 Android 工程师的技术分享直播,主题是 Android 最新的 UI 框架 ...
- Kotlin协程简介
1. 什么是协程 关于协程的定义有很多,在Kotlin语言中,协程比较合理的定义应该是一个线程框架(扔物线)或者说是一种并发设计模式(官方).它是由官方设计的一套API方便开发者进行多线程开发. 2 ...
- Kotlin 协程是个什么东西?
相关阅读:一个90后员工猝死的全过程 协程是什么 根据维基百科的定义,协程(Coroutine)是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复. 协程(Coroutine) ...
- pdf 深入理解kotlin协程_Kotlin协程实现原理:挂起与恢复
今天我们来聊聊Kotlin的协程Coroutine. 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine? 如果你已经接触过协程,但对协程的原理存 ...
- Kotlin协程实现原理
前言 本篇解析Kotlin/JVM中的协程的实现原理. 初看suspend关键字 下面的例子模拟一个网络请求: class Temp {suspend fun fetchData(argument: ...
最新文章
- python自带的shell是什么-python中执行shell的两种方法总结
- 【Matlab 图像】图像基础操作
- 快速上手linux玩转典型网络,5- 快速上手Linux玩转典型应用- Linux常用命令
- yelee主题中的Busuanzi网站统计失效问题
- 新疆尉犁县境内塔克拉玛干沙漠雪景美如画
- Spring Java-based容器配置
- CentOS设置时区
- java 自己写一个模板_写一个java生成模板
- 使用JsonCpp编写JSON封装程序的方法
- HCIE Security 双机热备 备考笔记(幕布)
- SpringBoot酒店管理系统 hotel.liuyanzhao.com
- 常见HTTP状态码大全
- cmd 批量复制文件/文件夹
- python3写的腾讯漫画下载器
- java-老鼠出迷宫
- 第四期:如何通过知晓云自动回复客服消息
- 被孙杨遮挡LOGO的安踏,到底做错了什么?
- 电子科大和北邮计算机,同为IT名校,北京邮电大学和电子科技大学谁更胜一筹?...
- sklearn数据预处理(二)非线性转换
- scheme唤醒外部APP