Kotlin流程(Flow)是由JetBrains公司开发的一种全新的流式API(Stream API)。JetBrains同时也是Kotlin这门语言的发明者。Kotlin流程是基于响应式流规范(Reactive Stream specification)的一个实现,这个规范的目标是为异步流处理提供一个统一的标准。Kotlin流程构建于Kotlin协程的基础之上。关于Kotlin协程的介绍,请参阅我之前的博文《五分钟说清楚Kotlin协程和Android的那点事》。
通过使用Kotlin流程来处理数据流,我们只需要编写少量的代码,就能够以复杂的、多线程的方式来转换数据,这可用大大提高开发的效率。
本文将带大家一步步了解Kotlin流程的以下方面:
- 数据收集和流;
- 同步和异步API的调用;
- 冷/热数据流;
- 流程处理期间的异常处理。
返回多个值
我们知道,Suspend函数可以异步地返回单个值。使用Suspend函数,我们不必担心主线程被阻塞,因为Kotlin协程会为我们提供主线程安全的保障。
与suspend函数不同,Kotlin流程可以异步地返回多个值。异步操作是指我们需要长时间等待的操作,例如网络请求等。我们永远都不知道这些操作需要多长时间才能执行完毕。因此,任何长时间运行的操作都应该是异步的,因为等待这些操作会阻塞应用程序。使用Suspend函数与Kotlin流程有很大的不同,下面举几个例子。
列表(List)
我们定义一个suspend函数,它返回一个整数列表。
suspend fun getValues(): List<Int> {
delay(1000)
return listOf(1, 2, 3)
}
上述函数将待返回的整数值添加到列表中,并通过delay来模拟长时间运行的操作,就像网络请求一样。接下来,我们添加一个函数来处理这些整数值:
fun processValues() {
runBlocking {
val values = getValues()
for (value in values