说起Kotlin的协成入门我们不是说语法而是要先去踩坑---采砂坑?楼主细细道来……
上午上班没事打开我那用了五年的最近电池鼓包的MacBook Pro美美的新建一个package和main方法之后翻开官网使用我那蹩脚的英语看看起了协成。本来也不算是太过深奥的英语大概十几分钟就看完开始撸代码吧……然鹅为啥找不到GlobalScope.launch?悲剧就此发生啦
又是然鹅咱不能就此放弃,因此这回才在这里码日记---因为协成这个东西并不在标准库里面。啥?这么重要的东西竟然不在标准库中,哈哈哈就是这么让人意外吧,既然知道了原因就好说了,无非是dao包 maven gradle…
以我已有项目为例
使用maven还是很方便的就添加好依赖库--目前稳定版本是1.3.1
问题解决了,我们开始今天的协成吧
代码语言:javascript复制import kotlinx.coroutines.*
fun main(args: Array<String>) {
GlobalScope.launch {
println("Hello")
}
}
上面是一个协成,然而你是看不到输出的,也学你会十分的疑惑这些都待后续我们就会了解,今天我们只说基础的认识一下协成的一些操作和概念。那么怎么才能看到Hello输出呢?
代码语言:javascript复制import kotlinx.coroutines.*
fun main(args: Array<String>) {
println("start")
GlobalScope.launch {
println("Hello")
}
Thread.sleep(500)
println("end")
}
为了方便起见我们添加了打印标记,我们看到添加Thread.sleep之后我们看到了协成的执行,这是为什么呢?
大家都知道main方法是执行在主线程,看看是否如此
代码语言:javascript复制fun main(args: Array<String>) {
val thread1 = Thread.currentThread()
println("start")
GlobalScope.launch {
println("Hello")
}
Thread.sleep(500)
println("end")
}
从debug中我们可以看出,当前线程是main线程而我们的协成的目的是一个异步
代码语言:javascript复制GlobalScope.launch {
val thread2 = Thread.currentThread()
println("Hello")
}
的肺阻塞的设计尤其自己的线程。那么对于主线程没有阻塞的情况下协成还没开始执行或者执行的过程中主线程就已经结束伴随着协成也就被杀死啦
我们修改一下代码
代码语言:javascript复制 GlobalScope.launch {
val thread2 = Thread.currentThread()
println("Hello")
}
再次debug我们看到thread2是个什么东东,当前的线程已经不再是main线程而是换成了DefaultDispatcher-worker-1,这正好与我们上文说的一致-----协成还没来及执行主线程已经结束进而也就随主线程结束掉了
现在我们看看这个GlobalScope.launch是跟什么??
代码语言:javascript复制public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job{
}
我们先翻开官方的注释
大意就是说:协成是不会阻塞当前线程并且返回一个Job。与此同时呢当这个返回的job被取消的时候协成也是会苏子和被取消。
当launch的时候会被提供一个context作为上下文,当这个con'text没有分发器或者ContinuationInterceptor的时候会使用默认的默认的分发器。
而默认情况下,协成默认是立即执行的,当然了还有其他的几种选择比如:Lazy 等
上面的都是大一的翻译,总之大意就是协成有一套自己的任务分发体系,它是可以高度可定制化的……