Job 是协程上下文
CoroutineContext的实现之一,通过它我们可以对协程的生命周期进行一些控制操作。
Job 是协程的
句柄。使用
launch 或
async 创建的每个协程都会返回一个
Job 实例对象,该实例是相应协程的唯一标识并管理其生命周期。还可以将
Job 传递给
CoroutineScope 以进一步管理其生命周期,如以下示例所示:
class ExampleClass {
...
fun exampleMethod() {
// Handle to the coroutine, you can control its lifecycle
val job = scope.launch {
// New coroutine
}
if (...) {
// Cancel the coroutine started above, this doesn't affect the scope
// this coroutine was launched in
job.cancel()
}
}
}
我们通过Job可以获取当前协程的运行状态,还可以随时取消协程。
协程的状态查询:
-
isActive 活跃
-
isCompleted 已完成
-
isCancelled 已取消
如果协程处于活跃状态,协程运行出错或者调用
job.cancel() 都会将当前任务置为取消状态 (
isActive = false, isCancelled = true)。当所有的子协程都完成后,协程会进入已完成状态,此时
isCompleted = true。
常用的协程操作:
-
cancel 用于Job的取消,取消协程
-
start 用于启动一个协程,让其到达 Active状态
-
invokeOnCompletion 添加一个监听,当工作完成或者异常时会调用
-
join 阻塞并等候当前协程完成
start
协程不是默认创建就启动了吗? 怎么还有一个
start 方法 。
-
这个方法主要是针对通过懒加载 Lazy模式创建的协程,需要进行手动 start才能启动协程。
val job = GlobalScope.launch(start = CoroutineStart.LAZY) {
println("执行在协程中...")
delay(1000L)
println("执行完毕...")
}
job.start()
cancel
协程的取消,我们之前也讲到过,一般我们可以手动调用
cancel 或者在
onDestory的时候调用
cancel:
var job = GlobalScope.launch {
println("执行在协程中...")
delay(1000L)
println("执行完毕...")
}
...
override fun onDestroy() {
job.cancel()
super.onDestroy()
}
invokeOnCompletion
协程执行完的回调
invokeOnCompletion 也是我们常用的监听,在正常执行完毕,或者异常执行完毕都会回调这个方法。
val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
YYLogUtils.e(throwable.message ?: "Unkown Error")
}
val job = GlobalScope.launch(Dispatchers.Main + exceptionHandler) {
println("执行在另一个协程中.