Android食用指南之协程Coroutines基础知识(一)

779 阅读2分钟

在此之前,我们需要了解到底什么是协程?

网上随便一搜就能搜到好多balabala一大堆对协程进行科普的,看得人云里雾里,反倒是Kotlin官方给协程的定义更加简洁明了:

本质上,协程是轻量级的线程。——出自协程基础-第一个协程程序

那协程和线程有什么分别,又能帮我们解决什么问题,为什么要学习它?是线程池提不动刀了还是RxJava不够骚了?

一、轻量,更少的资源消耗

官方文档里面直接重复创建了10万个协程与创建10万个线程做对比,结果不出意外的创建10万个线程会直接因为内存不足Cash掉(虽然我们在正常开发过程中会使用线程池而不是傻傻的反复创建N个线程),但也足以说明协程的轻量。

二、更灵活的作用域

我们在创建线程的时候,无论在哪个线程中创建新的线程,新创建的线程作用域总是全局的,与使用GlobalScope.lunch开启协程的作用域相同,而协程还有更多更灵活的作用域。而且更妙的是协程的作用域可以和Android空间的生命周期做绑定,妈妈再也不担心我泄漏了...

三、挂起,非阻塞

协程在挂起时,不需要阻塞当前线程,几乎没有代价,很大程度上提高了线程的利用率。而线程的阻塞,你懂的,面试题背起...

四、用同步的方式,书写异步的代码

让我们先看一道面试题:

面试官:如何保证A、B、C三个线程按照顺序执行?

韭零后:(小声逼逼:网上有,茴香豆的四种写法,送分题啊)在一个线程结束启动另外一个线程或者使用线程的join方法等等..

面试官:你们日常开发都是new新线程吗?在线程池怎么解决这个问题?

韭零后,卒。

在线程中,保证几个线程顺序调用的问题确实没有优雅的解决方式,但是如果使用协程的话,这个问题将不复存在,因为协程默认就是对挂起方法进行顺序调用的。

suspend fun functionA(){do some 耗时操作...} 
suspend fun functionB(){do some 耗时操作...} 
suspend fun functionC(){do some 耗时操作...} 
GlobalScope.launch{
    functionA()
    functionB()
    functionC()
}

如果我们使用线程来处理这三个耗时操作,并且要保证方法执行的顺序,除了RxJava和回调地狱外,你还有什么解决方案?

其实写了这么多,我想说的只有一句:

image.png

还愣着干嘛,赶紧的,上号:

image.png