使用 flow 作为 API 调用的返回类型

rah*_*hat 3 android coroutine kotlin kotlin-coroutines kotlin-flow

我从过去 8 个月开始就开始关注 kotlin 和协同例程,根据我的理解,如果我们将它用作 api 调用的返回类型,那么它并不是流的最佳使用。

例如:

fun getCoutries(): Flow<List<Country>> = flow {
   emit(apiInterface.getAllCountries())
}
Run Code Online (Sandbox Code Playgroud)

我在一次性 api 调用中看到类似这样的流的使用,我想知道是否应该阻止这种情况。因为流是一股流,而不是一次射击。

Ser*_*gey 9

Flow是一个异步数据流,它顺序发出值并正常完成或出现异常。一次性 api 调用不是数据流,因此使用Flow它是一种开销。对于单个 api 调用,我将使用一个suspend将上下文切换到后台线程的函数:

fun suspend getCountries(): List<Country> = withContext(Dispatchers.IO) {
    apiInterface.getAllCountries()
}
Run Code Online (Sandbox Code Playgroud)

使用 aFlow取决于特定的用例。无论如何,如果你需要一个,Flow你总是可以从挂起函数中创建它:

fun getCountriesFlow(): Flow<List<Country>> = flow {
    // make request and emit items each ten seconds
    while(true) {
        emit(getCountries())
        delay(10000)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于单个 api 调用,最好使用函数suspend。另一方面,Flow是一种可以顺序发出多个值的类型,但它并不能阻止Flow仅发出一个值,因此这又取决于用例。