美文网首页
用于并行多个网络调用的 Kotlin Flow Zip 运算符

用于并行多个网络调用的 Kotlin Flow Zip 运算符

作者: 安安_660c | 来源:发表于2022-07-15 19:28 被阅读0次

前言

在本章节中,我们将学习 Kotlin Flow Zip Operator 以及如何使用它并行进行多个网络调用。本教程还将帮助您使用 Kotlin Flow Zip Operator 并行执行任何类型的后台任务。

在开始之前,为了您的信息,这篇博文是我们正在编写的关于 Kotlin 协程中的 Flow API 的系列文章的一部分。
让我们开始吧。

首先,让我们了解一下 Kotlin Flow 中的 zip 运算符是什么。

Kotlin Flow 中的 zip 运算符是什么?

Zip Operator是一个算子,它通过指定的函数将两个流集合的排放组合在一起,并根据该函数的结果为每个组合发出单个项目。



让我们看看代码:

val flowInt = flowOf(1, 2, 3)
val flowString = flowOf("A", "B", "C")
flowInt.zip(flowString) { intValue, stringValue ->
    "$intValue$stringValue"
}.collect {
    Log.d(TAG, it)
}

结果将是:

1A

2B

3C

并行多个网络调用

Android 中的一个真实用例:当我们想要并行进行两个网络调用,并希望两个网络调用都完成时,两个网络调用的结果都在一个回调中。

我将把<u style="text-decoration: none; border-bottom: 1px solid rgb(68, 68, 68);">这个项目</u>用于实施部分。您可以在项目本身中找到此博客中提到的实现的完整代码

我们将以ParallelNetworkCallsViewModel项目中存在的示例为例。

基本上,这ParallelNetworkCallsViewModel是一个与之关联的 ViewModel,ParallelNetworkCallsActivity它触发ViewModel获取要呈现到 UI 中的用户列表。,ParallelNetworkCallsViewModel然后向数据层询问使用 的用户列表ApiHelper。ViewModel 并行进行两个网络调用,分别是 asgetUsersgetMoreUsers

所以,这里我们有两个flow网络调用:

  • getUsers
  • getMoreUsers

如下所示,ViewModel 使用 Kotlin 协程和 LiveData。另外,请注意下面的代码中使用了zip运算符。

class ParallelNetworkCallsViewModel(
    private val apiHelper: ApiHelper,
    private val dbHelper: DatabaseHelper
) : ViewModel() {

    private val users = MutableLiveData<Resource<List<ApiUser>>>()

    init {
        fetchUsers()
    }

    private fun fetchUsers() {
        viewModelScope.launch {
            users.postValue(Resource.loading(null))
            apiHelper.getUsers()
                .zip(apiHelper.getMoreUsers()) { usersFromApi, moreUsersFromApi ->
                    val allUsersFromApi = mutableListOf<ApiUser>()
                    allUsersFromApi.addAll(usersFromApi)
                    allUsersFromApi.addAll(moreUsersFromApi)
                    return@zip allUsersFromApi
                }
                .flowOn(Dispatchers.Default)
                .catch { e ->
                    users.postValue(Resource.error(e.toString(), null))
                }
                .collect {
                    users.postValue(Resource.success(it))
                }
        }
    }

    fun getUsers(): LiveData<Resource<List<ApiUser>>> {
        return users
    }

}

在这里,由于我们使用了zip运算符,它同时进行两个网络调用,并在两个网络调用都完成时在一个回调中给出两个网络调用的结果。

通过使用 Zip 运算符压缩两个流集合,两个网络调用并行运行。当两者都完成时,我们得到结果。这样,我们一次得到两个流集合的结果。


Flow的Zip算子的优势

  • 并行运行这两个任务。
  • 当两个任务都完成时,在一个回调中返回两个任务的结果。

这样我们就可以使用 Flow 的 Zip Operator 来解决有趣的问题。

作者:Amit Shekhar
链接:https://blog.mindorks.com/kotlin-flow-zip-operator-parallel-multiple-network-calls

相关文章

网友评论

      本文标题:用于并行多个网络调用的 Kotlin Flow Zip 运算符

      本文链接:https://www.haomeiwen.com/subject/ioxkirtx.html