2015-11-04 2 views
1

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

У меня также есть сингллеты службы данных, которые используются моделями просмотра, которые также живут бесконечно. Так что, если я начну вызов асинхронной на мой взгляд, модель с использованием асинхронной блок АНКО т.е.

async { 
    val data = DataService.instance.getData() 

    uiThread { 
     if (data != null) { 
      //do something 
     } 
    } 
} 

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

ответ

1

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

+0

так что я предполагаю, что это означает, что асинк {ui {}} всегда должен быть закодирован в активности и/или фрагменте? Будет ли выполняться uiThread, если ротация происходит до вызова? –

+0

Да, используйте uiThread, если результат выполнения async не может быть сохранен независимо от действия/фрагмента. Когда устройство повернуто, активность воссоздается, поэтому код в uiThread не будет выполняться. – davehenry

+0

Обратите внимание, что если вы сделаете это в фрагменте, вам все равно нужно проверить, действительно ли этот фрагмент прикреплен, то есть если 'activity! = Null'. Это связано с тем, что фрагмент можно отсоединить, но не собрать мусор. –

0

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

Смежные вопросы