Coroutine 基本原理,android性能优化和内存优化

eg: 需要请求两个api, 然后拿着这两个api的值做一个整合,最后在页面显示出来

  1. 如果用回调的方式,写法如下

//回调方式
getCard(canId)
.enqueue(obj : Callback {

override fun onResponse(call:Call,
response: Resoinse) {
val card = resonse.body()
getSofList(canId)
.enqueue(obj : Callback {

override fun onResponse(call:Call
response: Resoinse) {
val sofList = response.body()
show(suspendMerge(cardDetail, sofList)) // 合并两个信息 & UI显示
})
}
})

👆这个代码就是用回调的方式实现的,它有什么问题呢?
两个网络请求原本是可以并行的网络请求,只是他们需要一起展示出来。如果用回调的方法,就会被做成一个串行的,然后网络等待多了一倍。

  1. 那我们再用Kotlin的协程实现一下呢?

//协程
suspend fun showCard(){
val cardDetail = getCard(canId) // 获取卡详情
val sofList = getSofList(canId) // 获取银行卡信息
val cardInfo = suspendMerge(cardDetail.await, sofList.await) // 合并两个信息
show(cardInfo) // UI显示
}

哇塞!是不是炒鸡简洁明了😄 对了,这就是为什么要用kotlin协程。这个里面干了啥我们不用管,反正此刻只需要知道,协程就让原本用callback写起来很复杂的东西变的整洁干净,清晰明了就好了。

挂起函数(suspend函数)

刚上面就出现了一个关键字 suspend, 那这个加了suspend这个词的函数又是啥呢? -> 挂起函数

那什么是挂起函数?

就是在普通的函数前面加一个关键字 suspend
一般函数写法:

fun getCard() {

}

挂起函数写法:

suspend fun getCard() {

}

suspend关键字作用:

提醒 这个函数的调用者: 我是一个耗时的函数, 请在协程中调用我。

挂起函数作用

说了半天,为什么要用挂起函数?
挂起的意思是:暂时从当前线程脱离,一会儿再切/恢复回来(resume)
当一个函数从当前线程A挂起后,就出现了两条线:

  1. A线程:该执行什么执行什么,比如刷新界面,或者没有其他事情可做就被回收再利用
  2. 挂起函数:切换到指定线程,并从被挂起的那行代码开始,继续向下执行代码,执行完以后,再切回到A线程

举个例子吧:
安卓开发中,主线程Main正在执行任务,执行到一个网络请求N(挂起函数)时,N脱离主线程,到指定的IO线程做网络请求。 然后线程Main将继续渲染界面(比如转圈圈loading),等N在IO线程执行结束后,切回Main线程,拿着刚请求完的值,继续做后序操作(比如loading结束,显示请求回来的数据结果)

挂起函数问题

  1. 挂起的对象是协程
  2. 挂起函数只能在另一个挂起函数或者协程中被调用:why?
    因为,切走再恢复(resume)回来是协程的东西,所以只能在协程中调用

原理

好了,现在知道什么是suspend函数了,但是具体是实现或者它原理是什么样的呢?我们来慢慢捋一捋。
挂起函数就是在普通的函数前面加一个关键字suspend,然而Java 平台并没有 suspend 关键字,也没有 suspending 机制,那kotlin又是怎么实现了可以用看起来阻塞的方式实现不阻塞的代码的呢?

CPS 变换

Kotlin 编译器会对 suspending 方法做特殊处理,对代码进行转换,从而实现 suspending 机制。
那 Kotlin 编译器做了哪些处理?简单说,主要做了下面这三项处理:

处理一:增加 Continuation 类型入参,返回值变为 Any?
处理二:生成 Continuation 类型的匿名内部类
处理三:对 suspending 方法的调用变为 switch 形式的状态机
以上引用于作者: 编走编想

那我们来看看最根本的变化:

//挂起函数的函数签名
suspend fun CompletableFuture.await():

变化后

fun CompletableFuture.await(continuation: Continuation): Any?

可以看到,编译器做了什么? 传入了一个Continuation并且返回类型变为了Any?

  • Continuation是什么?

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

资料领取

点击这里免费获取

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

费获取](https://bbs.csdn.net/topics/618156601)**

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值