admin管理员组

文章数量:1643280

前言

一直以为对于Kotlin,自己算是能够应付正常开发了….进了头条之后,才发现别说是应付开发了,简直是差得远呢。由其是参与到Kotlin程度化极高的大型项目中,这种差距感非常之大。最近在看代码的时候,很是疑惑。项目中竟然没有出现Thread。后来才发现是自己孤陋寡闻,整个项目已经用协程全面替换了Thread。所以今天就来好好记录一下:协程这么一个知识点。

正文

协程其实是Kotlin中比较早出现的内容,不过最近才释放了正式版。我们想要使用也比较的简单:提一下Kotlin的版本,比如:

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0'

依赖一下协程的包:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'

开篇先聊一聊协程的作用是啥?为啥整个项目直接用协成替换了Thread?它又是如何能够在如此大的项目中直接扮演Thread这么重要的角色?

首先来上一段概念:协程是一个轻量级的线程。接下来用一个官方的demo,解释一下协程为什么能够被如此重视(Kotlin demo):

Demo很简单,开启10w个协程。等等?启动10w个??没错,这里可以很顺畅的启动10w个!这里我们想想,如果我们启动10w个Thread会是什么样子。笑哭.png~

从这上边来看,协程的确可以称的上轻量级。那么,协程的优点仅此而已么?不着急,我们一点点来看。

1.1、用法

协程的写法很简单:

单纯这样,似乎不是很清晰,我们看一下另一种写法:

想要launch一下协程,前提是需要一个协程上下文环境,说白了就是Kotlin帮我们去完成线程的调度。而这里GlobalScope.launch就是创建一个协程环境并且启动一个协程。我们上述代码传的参数:Dispatchers.Default、newSingleThreadContext("MyThread")就是更换协程上下文环境。

协程上下文包括了一个 协程调度器,它确定了相应的协程在执行时使用一个或多个线程。协程调度器可以将协程的执行局限在指定的线程中,调度它运行在线程池中或让它不受限的运行。

不过,没事不要轻易newSingleThreadContext("MyThread"),newSingleThreadContext会为协程的运行启动了一个新的线程。 既然起一个新的线程,那么协程就没啥意义了~所以正常使用交给默认去做就OK了。

1.2、取消

协程中,我们可以很轻易的对这个任务进行取消。

当然,这里面涉及一些父协程,子协程的顺序、细节问题。有兴趣的话可以在文档中查看。PS:一般也用不到,一个协程走天下。

2.1、async/await

协程好玩的地方就在于这个功能。我们想一个功能:正常在Java中,我们想在Thread中得到返回值。一般来说我们会通过CallBack,比如:

而协程给出来的解决方案可就方便的多。

async需要运行在一个协程环境之中,所以我们这里用了一个GlobalScope.launch。

async会返回一个Deferred对象,在async方法结束的时候,就会调用await()方法。因此,我们可以通过await()就可以得到异步回调。有了这个特性,我们网络请求的时候就会非常的方便。

尾声

似乎收尾的有些唐突,不过水平有限,目前就简单记这些内容吧,因为自己也是刚起手开始用。等自己在项目中熟练掌握,并且跟同事们学精了之后,再继续总结新的内容。所以,不着急一步一步来。

本文标签: 网络用协程做Kotlin聊一聊