Как я могу отменить внутри CoroutineScope, и обнаружить отмену - PullRequest
1 голос
/ 18 июня 2019

Обнаружение отмены от CoroutineScope

Я пытаюсь обнаружить отмену из CoroutineScope, но свойство isCancelled не изменяется, когда я пытаюсь вызвать метод отмены внутри CoroutineScope

Метод, который я ожидал отменить сопрограмму из ViewModel

fun login() = viewModelScope.launch{
        try{
            repository.login(emailLogin.get()!!, passwordLogin.get()!!)
        }catch (e: AuthenticationHttpErrorException){
            cancel(CancellationException(e.message))
            Toast.makeText(getApplication(),e.message, Toast.LENGTH_SHORT).show()
            Log.e("ERROR LOGIN", e.message)
        }
    }

Как я вызвал метод входа из Activity

fun submitLogin(view: View){
        val loginResult = authenticationViewModel.login()
        if(loginResult.isCancelled){
            Log.e("LOGIN FAILED", "Login cancelled")
        }else{
            Log.v("LOGIN SUCCESS", "Login success")
        }
    }

Я ожидаю, что isCancelled свойство изменится на true, когда я вызову метод cancel из CoroutineScope и вызову некоторый код внутри оператора if

Ответы [ 2 ]

1 голос
/ 18 июня 2019

launch запускает асинхронную сопрограмму.Поэтому тело login будет запущено позже, и вы не сможете получить доступ к результату сразу после вызова.В вашем примере простая suspend функция может быть лучше.

0 голосов
/ 18 июня 2019

Вы отменяете его в блоке catch.Это означает, что repository.login(emailLogin.get()!!, passwordLogin.get()!!) не выдает никаких исключений.Или, если это так, возможно, это не AuthenticationHttpErrorException, который выбрасывается.Просто, чтобы проверить, что происходит ошибка, попробуйте перехватить общий Exception, а затем обработать сопрограмму так же. Так:

catch (e: Exception)

...