Метод Android onDestroy() работает не так, как ожидалось

#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();
    }