Kotlin поток и сбор синхронно - PullRequest
1 голос
/ 27 мая 2020

У меня есть такой код, и я хочу собрать результаты вызова 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
    }

Я также пробовал asyn c вместо запуска, и ждать вместо соединения

1 Ответ

0 голосов
/ 27 мая 2020

Время выполнения вычисления с использованием 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
    }
...