前言
在这篇文章中,我们将讨论不同类型的流构建器以及如何使用流构建器创建流。
让我们开始吧。
我们将介绍以下内容:
- 流量生成器的类型
- 使用 Flow Builder 创建流
流量生成器的类型
有 4 种类型的流量生成器:
- flowOf():它用于从给定的一组项目创建流。
- asFlow():它是一个扩展函数,有助于将类型转换为流。
- flow{}:这是我们在 Flow 的 Hello World 示例中使用的。
- channelFlow{}:此构建器使用构建器本身提供的发送来创建带有元素的流。
例子:
lowOf()
flowOf(4, 2, 5, 1, 7)
.collect {
Log.d(TAG, it.toString())
}
asFlow()
(1..5).asFlow()
.collect {
Log.d(TAG, it.toString())
}
flow{}
flow {
(0..10).forEach {
emit(it)
}
}
.collect {
Log.d(TAG, it.toString())
}
channelFlow{}
channelFlow {
(0..10).forEach {
send(it)
}
}
.collect {
Log.d(TAG, it.toString())
}
现在,我们将学习如何使用 Flow 构建器创建 Flow。我们可以使用 Flow Builder 为任何任务创建 Flow。
使用 Flow Builder 创建流
让我们通过例子来学习它。
将文件从一个位置移动到另一个位置
在这里,我们将使用 Flow Builder 创建 Flow,以便在后台线程中将文件从一个位置移动到另一个位置,并在主线程上发送完成状态。
val moveFileflow = flow {
// move file on background thread
FileUtils.move(source, destination)
emit("Done")
}
.flowOn(Dispatcher.Default)
CoroutineScope(Dispatchers.Main).launch {
moveFileflow.collect {
// when it is done
}
}
下载图像
在这里,我们将使用 Flow Builder 创建我们的 Flow 来下载图像,这将在后台线程中下载图像并继续将进度发送到主线程上的收集器。
val downloadImageflow = flow {
// our image downloading code
// start downloading
// send progress
emit(10)
// downloading...
// ......
// ......
// send progress
emit(75)
// downloading...
// ......
// ......
// send progress
emit(100)
}
.flowOn(Dispatcher.Default)
CoroutineScope(Dispatchers.Main).launch {
downloadImageflow.collect {
// we will get the progress here
}
}
这就是创建 Flow 的方式。