等等,好像哪里不对,奇怪的知识点突然有点增多啊。
上面提到协程体中最后一行是什么类型,最终返回的是什么类型T
就是什么类型,好像跟我们想的不一样,返回值不应该是用return吗,学过kotlin
的会知道,在的kotlin
高阶函数中,lambda
表达式如果你没有显式返回一个值,那它将隐式返回最后一个表达式的值。
那Job
、Deferred
和协程作用域
又是些啥玩意!
不急,慢慢来,我们一个一个的来解释清楚。
Job
我们可以认为他就是一个协程作业是通过CoroutineScope.launch
生成的,同时它运行一个指定的代码块,并在该代码块完成时完成。我们可以通过isActive
、isCompleted
、isCancelled
来获取到Job
的当前状态。Job
的状态如下图所示,摘自官方文档:
协程的生命周期
| State | [isActive] | [isCompleted] | [isCancelled] |
| — | — | — | — |
| New (optional initial state) | false
| false
| false
|
| Active (default initial state) | true
| false
| false
|
| Completing (transient state) | true
| false
| false
|
| Cancelling (transient state) | false
| false
| true
|
| Cancelled (final state) | false
| true
| true
|
| Completed (final state) | false
| true
| false
|
我们可以通过下图可以大概了解下一个协程作业从创建到完成或者取消,Job
在这里不扩展了,后面我们会在实际使用过程中去讲解。
wait children
±----+ start ±-------+ complete ±------------+ finish ±----------+
| New | -----> | Active | ---------> | Completing | -------> | Completed |
±----+ ±-------+ ±------------+ ±----------+
| cancel / fail |
| ±---------------+
| |
V V
±-----------+ finish ±----------+
| Cancelling | --------------------------------> | Cancelled |
±-----------+ ±----------+
Deferred
Deferred
继承自Job
,我们可以把它看做一个带有返回值的Job
,
public interface Deferred : Job {
//返回结果值,或者如果延迟被取消,则抛出相应的异常
public suspend fun await(): T
public val onAwait: SelectClause1
public fun getCompleted(): T
public fun getCompletionExceptionOrNull(): Throwable?
}
我们需要重点关注await()
方法,可以看到await()
方法返回结果是T
,说明我们可以通过await()
方法获取执行