Что происходит, когда кнопка «Назад» нажата до завершения асинхронного вызова?

У меня есть модели просмотра, которые хранятся в списке массивов в классе приложения. Таким образом, их продолжительность жизни продолжается, даже если активность уничтожается из-за вращения (однако, как только значение isFinishing истинно, экземпляр модели представления удаляется из списка и перестает существовать).

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

async { val data = DataService.instance.getData() uiThread { if (data != null) { //do something } } } 

Что произойдет, если пользователь нажимает кнопку «Назад» до завершения вызова? IsFinishing будет правдой, и мой экземпляр модели представления больше не будет существовать. Будет ли исключение асинхронного вызова, когда оно вернется или оно умрет грациозно?

Код в вызове uiThread не будет выполнен, если базовый контекст действия / фрагмента был собран мусором. Вызов uiThread в асинхронном вызове будет содержать WeakReference для контекста, поэтому часто встречающаяся утечка контекстной памяти не будет возникать. Подробности здесь .

Думаю, это изящно умрет. Вы можете написать небольшую тестовую программу, в которой вы отлаживаете поведение. Однако я настоятельно рекомендую сохранить ссылку / указатель на асинхронную задачу и убить ее, когда вы нажмете кнопку «Назад». Не нужно позволять ему работать в фоновом режиме, если вам не нужен результат / не может обрабатывать результат больше