kotlin Courynine Asyn c не работает в viewModelScope в Android - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь выполнить 2 сетевых запроса, один за другим, но только первый идет, второй никогда не выполняется: Вот мой код

fun getData(todaysDateStart: Long, todaysDateEnd: Long) {
        viewModelScope.launch(Dispatchers.IO) {
            val job1 = async {
                dataManager.getAllListsWithTaskCount()
                    .collect { taskListsFromDb: List<TaskListAndCount> ->
                        if (taskListsFromDb.isNotEmpty()) {
                            withContext(Dispatchers.Main) {
                                taskListAndCount.value = Resource.Success(taskListsFromDb)
                            }
                        } else {
                            withContext(Dispatchers.Main) {
                                taskListAndCount.value = Resource.Loading
                            }
                            val response = safeApiCall {
                                dataManager.getUserTaskLists(
                                    dataManager.getUserId(),
                                    dataManager.getAccessToken()
                                )
                            }

                            when (response) {
                                is Resource.Success -> {
                                    val jsonObject = response.data.asJsonObject
                                    if (jsonObject["success"].asBoolean) {
                                        insertTaskListsInDb(jsonObject)
                                    } else {
                                        withContext(Dispatchers.Main) {
                                            taskListAndCount.value =
                                                Resource.Error(IOException(jsonObject.get("message").asString))
                                        }
                                    }
                                }
                                is Resource.Error -> {
                                    withContext(Dispatchers.Main) {
                                        taskListAndCount.value = response
                                    }
                                }
                            }
                        }
                    }
            }

            job1.await()

            val job2 = async {
                dataManager.getTasksForToday(todaysDateStart, todaysDateEnd)
                    .collect { tasksAndListFromDb: List<TaskAndTaskList> ->
                        if (tasksAndListFromDb.isNotEmpty()) {
                            withContext(Dispatchers.Main) {
                                taskAndTaskList.value = Resource.Success(tasksAndListFromDb)
                            }
                        } else {

                            withContext(Dispatchers.Main) {
                                taskAndTaskList.value = Resource.Loading
                            }
                            val response = safeApiCall {
                                dataManager.getUserTasks(
                                    dataManager.getUserId(),
                                    dataManager.getAccessToken()
                                )
                            }

                            when (response) {
                                is Resource.Success -> {
                                    val jsonObject = response.data.asJsonObject
                                    if (jsonObject["success"].asBoolean) {
                                        insertTasksInDb(jsonObject)
                                    } else {
                                        withContext(Dispatchers.Main) {
                                            taskAndTaskList.value =
                                                Resource.Error(IOException(jsonObject["message"].asString))
                                        }
                                    }
                                }
                                is Resource.Error -> {
                                    withContext(Dispatchers.Main) {
                                        taskListAndCount.value = response
                                    }
                                }
                            }
                        }
                    }
            }

            job2.await()
        }

    }

    private suspend fun insertTaskListsInDb(jsonObject: JsonObject) {
        val taskListsJsonArray = jsonObject["task_lists"].asJsonArray
        val taskListsFromNetwork: MutableList<TaskList> = arrayListOf()
        taskListsJsonArray.forEach { taskListJsonElement: JsonElement ->
            taskListsFromNetwork.add(
                TaskList(
                    0,
                    taskListJsonElement.asJsonObject["list_slack"].asString,
                    taskListJsonElement.asJsonObject["name"].asString,
                    taskListJsonElement.asJsonObject["color"].asString
                )
            )
        }
        dataManager.insertTaskLists(taskListsFromNetwork)
    }

    private suspend fun insertTasksInDb(jsonObject: JsonObject) {
        val tasksJsonArray = jsonObject["tasks"].asJsonArray
        val tasksAndListFromServer = mutableListOf<Task>()
        tasksJsonArray.forEach { taskJsonElement: JsonElement ->
            tasksAndListFromServer.add(
                Task(
                    0,
                    taskJsonElement.asJsonObject["user_task_id"].asString,
                    taskJsonElement.asJsonObject["task_slack"].asString,
                    taskJsonElement.asJsonObject["task"].asString,
                    taskJsonElement.asJsonObject["date_time"].asLong,
                    taskJsonElement.asJsonObject["list_slack"].asString
                )
            )
        }

        dataManager.insertTasks(tasksAndListFromServer)
    }

job2.await никогда не выполняется. Пожалуйста, помогите.

ОБНОВЛЕНИЕ 1: Я закончил тем, что сделал это, но он все еще не выполняет второй сетевой запрос:

un getData(todaysDateStart: Long, todaysDateEnd: Long) {
    viewModelScope.launch {
        dataManager.getAllListsWithTaskCount()
            .collect { taskListsFromDb: List<TaskListAndCount> ->
                if (taskListsFromDb.isNotEmpty())
                    taskListAndCount.value = Resource.Success(taskListsFromDb)
                else {

                    taskListAndCount.value = Resource.Loading

                    val response = safeApiCall {
                        dataManager.getUserTaskLists(
                            dataManager.getUserId(),
                            dataManager.getAccessToken()
                        )
                    }

                    when (response) {
                        is Resource.Success -> {
                            val jsonObject = response.data.asJsonObject
                            if (jsonObject["success"].asBoolean) {
                                insertTaskListsInDb(jsonObject)
                            } else {
                                taskListAndCount.value =
                                    Resource.Error(IOException(jsonObject.get("message").asString))
                            }
                        }
                        is Resource.Error -> {
                            taskListAndCount.value = response
                        }
                    }
                }
            }

        dataManager.getTasksForToday(todaysDateStart, todaysDateEnd)
            .collect { tasksAndListFromDb: List<TaskAndTaskList> ->
                if (tasksAndListFromDb.isNotEmpty())
                    taskAndTaskList.value = Resource.Success(tasksAndListFromDb)
                else {
                    taskAndTaskList.value = Resource.Loading

                    val response = safeApiCall {
                        dataManager.getUserTasks(
                            dataManager.getUserId(),
                            dataManager.getAccessToken()
                        )
                    }

                    when (response) {
                        is Resource.Success -> {
                            val jsonObject = response.data.asJsonObject
                            if (jsonObject["success"].asBoolean) {
                                insertTasksInDb(jsonObject)
                            } else {
                                taskAndTaskList.value =
                                    Resource.Error(IOException(jsonObject["message"].asString))
                            }
                        }
                        is Resource.Error -> {
                            taskListAndCount.value = response
                        }
                    }
                }
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...