深入理解Kotlin协程
上QQ阅读APP看书,第一时间看更新

1.1.2 异步与回调

从不同的角度来审查我们的程序,得出的结论也不同。如果只取其中很小的一段,那么多数情况下我们能看到的也不过只是一段顺序执行的指令,如代码清单1-1所示。

代码清单1-1 同步代码


println("A")
println("B")

但如果多看些代码,情况也许就变得不一样了,如代码清单1-2所示。

代码清单1-2 异步代码


val task = {
  println("C")
}

println("A")
thread(block = task)
println("B")

尽管看上去task先传给thread调用,但B和C却不一定哪个先输出。

异步任务可能很耗时(例如I/O任务),也可能因为某种原因不能立即执行(例如延时任务),我们不希望它阻碍程序主流程。等异步任务执行完毕,如果调用者关心结果,那么就要通过回调通知调用者,如代码清单1-3所示。

代码清单1-3 异步回调


val callback = {
  println("D")
}

val task = {
  println("C")
  callback() // ... ①
}

println("A")
thread(block = task)
println("B")

我们定义了一个callback,并在task执行完毕后的①处调用这个callback,让调用者收到这个事件。以上程序的执行流程如图1-2所示。

图1-2 异步回调

当然,实践当中通常会涉及从C到D的过程中的线程切换,主流程执行到B时可能通过执行某种操作开始等待异步任务,直到在D处将异步任务转回主流程。

提示 thread函数是Kotlin标准库中对Java Thread的封装,调用后默认立即启动线程执行。