Отмена задания Asyn c приводит к отмене родительского задания - PullRequest
0 голосов
/ 23 марта 2020

Я попытался запустить два асинхронных c задания.

При нажатии на кнопку появляется возможность отменить одно из заданий. Но я заметил, что когда я это сделаю, другая работа тоже будет отменена.

Что случилось?

class SplashFragment : BaseFragment(R.layout.fragment_splash), CoroutineScope by MainScope() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    launch {
        val countdown = async { countDown() }
        val ipAndMaintain = async { checkIPAndMaintain() }

        btnSkip.onClick {
            countdown.cancel() // cancel countdown
            btnSkip.isVisible = false
            if (!ipAndMaintain.isCompleted) {
                showLoadingDialog()
            }
        }
        countdown.await()
        startOtherPage(ipAndMaintain.await())
    }
}

private suspend fun countDown() {
    var time = 3
    while (time >= 0) {
        btnSkip.text = getString(R.string.skip, time)
        delay(1000)
        yield()
        time--
    }
}

private suspend fun checkIPAndMaintain(): Int {
    delay(2000)
    return 1
}

}

1 Ответ

2 голосов
/ 23 марта 2020

Когда вы звоните await на отмененную Deferred, выдается исключение. Если вы не поймаете его, он будет передан родительской сопрограмме, которая отменит все его дочерние элементы. Оберните свою инструкцию countdown.await() блоком try-catch, и вы увидите, что другая сопрограмма продолжается. Это эффект структурированного параллелизма.

Вы можете прочитать эту статью Роман Елизаров о топи c.

...