Kotlin流和收集同步

问题描述 投票:0回答:1

我有这样的代码,我想在coroutine中收集api调用的结果,然后加入这个工作,并从函数中返回。

 private suspend fun loadRangeInternal(offset: Int, limit: Int):  List<Activity> {

        // load data from Room database
        // calling Retrofit request
        // and caching them if there is no data available

        var activities: List<Activity> = listOf()

        val job = GlobalScope.launch {
            repo.loadActivitiesOf(settings.companyId, offset, limit)
                .collect {
                    networkError.send(it.error)

                    when (it.status) {
                        Resource.Status.SUCCESS -> {
                            activities = it.data ?: listOf()
                            isLoading.send(false)
                        }
                        Resource.Status.LOADING -> {
                            isLoading.send(true)
                        }
                        Resource.Status.ERROR -> {
                            isLoading.send(false)
                        }
                    }
                }
        }

        job.join()

        Timber.d("Activities loaded: $activities")

        return activities
    }

我也试过用async代替launch,用await代替join。

kotlin coroutine flow
1个回答
-1
投票

计算执行时间的方法 measureTimeMillis{} 并在那个时候延迟你的功能。

private suspend fun loadRangeInternal(offset: Int, limit: Int):  List<Activity> {

        // load data from Room database
        // calling Retrofit request
        // and caching them if there is no data available

        var activities: List<Activity> = listOf()
 val executionTime = measureTimeMillis {
                    async {
                                repo.loadActivitiesOf(settings.companyId, offset, limit)
                                    .collect {
                                           networkError.send(it.error)

                                            when (it.status) {
                                              Resource.Status.SUCCESS -> {
                                                        activities = it.data ?: listOf()
                                                        isLoading.send(false)
                                               }
                                               Resource.Status.LOADING -> {
                                                        isLoading.send(true)
                                               }
                                               Resource.Status.ERROR -> {
                                                   isLoading.send(false)
                                             }
                                         }
                                 }
                      }.await()
                }
        delay(executionTime)
        Timber.d("Activities loaded: $activities")

        return activities
    }
© www.soinside.com 2019 - 2024. All rights reserved.