一、前言
数据流以协程为基础构建,可提供多个值。概念上来讲,数据流可以通过异步方式(挂起函数中执行)进行计算处理一组数据系列(这个与协程挂起函数返回单个值相反),但要求所发出值的类型必须相同。例如,Flow是发出整数值的数据流。
数据流包含是三个实体:
- 提供方:会生产添加到数据流中的数据。得益于协程,数据流还可以异步生成数据。
- 中介(可选):可以修改发送到数据流的值,或者修正数据流本身
- 使用方:使用数据流中的值
二、数据流使用
2.1 创建数据流
创建数据流,使用数据流构建器对应的API,目前有以下几种:flowOf(…)、asFlow()、flow{…}、channelFlow{…}、MutableStateFlow 和 MutableSharedFlow ,下面我们使用flow{…}来创建数据流,结合官方的例子进行数据流的使用说明.
**需求:**数据源以固定的时间间隔自动获取最新资讯。由于挂起函数只能返回单个值,不能返回多个连续值,因此可以使用数据流来实现该需求。
(1)定义获取网络数据数据接口:
interface NewsApi {
@GET("/chengyu/query")
suspend fun fetchLatestNews(
@Query("key") key: String,
@Query("word") word: String,
@Query("dtype") dtype: String
): ApiRsp<ArticleHeadline>
}
(2)在Repository中使用定义Flow数据流:
class NewsRepository(
private val api: NewsApi,
private val refreshIntervalMs: Long = 5000
) {
/**
* 获取数据
*/
fun loadNews(key: String, word: String, dtype: String): Flow<ApiRsp<ArticleHeadline>> {
return flow {
while (true) {
val latestNews = api.fetchLatestNews(key, word, dtype)
println("Req ThreadName:"+Thread.currentThread().name)
emit(latestNews)
delay(refreshIntervalMs)
}
}
}
}
flow构建器在协程内执行。因此它将受益于相同的异步API&#x