#android #ondestroy
Вопрос:
Я использую onDestroy()
метод, и мой код не завершен:
@Override
public void onDestroy() {
super.onDestroy();
for (int i = 0 ; i < 10; i ) {
Toast.makeText(this, "Destroy " i, Toast.LENGTH_SHORT).show();
}
}
for
Цикл останавливается на индексе 2. Почему цикл не заканчивается?
Ответ №1:
Прежде всего, в документации говорится, что onDestroy()
метод:
не следует использовать для выполнения действий, которые должны остаться после завершения процесса.
и:
Этот метод обычно реализуется для освобождения ресурсов, таких как потоки, связанные с действием
Также в начале документов о деятельности есть примечание о том, что методы onDestroy()
и onStop()
killable
:
методы, помеченные как убиваемые, после того, как этот метод вернет процесс, в котором выполняется действие, могут быть убиты системой в любое время без выполнения другой строки ее кода.
И есть рекомендация использовать этот onPause()
метод вместо тех, которые можно убить.
Таким образом, по-видимому, для функции есть какой-то внутренний тайм-аут Android onDestroy()
, который может контролировать, если в ней не происходит ничего слишком долгого, и если это произойдет, то это, вероятно, убьет выполнение. Это мое предположение.
Основываясь на том, что было в документации, я бы воздержался от использования этого метода для выполнения того, что вы здесь делаете, и вместо этого я бы попробовал использовать этот onPause()
метод.
Если код предназначен для выполнения только после завершения работы приложения, используйте этот isFinishing()
метод для его проверки. В документах рекомендуется такой подход:
Проверьте, находится ли это действие в процессе завершения, либо потому, что вы вызвали функцию finish (), либо кто-то другой попросил, чтобы оно было завершено. Это часто используется в onPause (), чтобы определить, просто ли действие приостанавливается или полностью завершается.
Ответ №2:
ответ @sweak в значительной степени объясняет, почему вам не следует этого делать. Но если вы очень хотите это сделать. Вы можете сделать так, как показано ниже, это завершит цикл for и выдаст результат всех 10 тостов.
@Override
public void onDestroy() {
for (int i = 0 ; i < 10; i ) {
Toast.makeText(this, "Destroy " i, Toast.LENGTH_SHORT).show();
}
super.onDestroy();
}