2017-01-24 4 views
0

В моей деятельности есть вызов метода OnDestroy(). Однако после этого я все еще вижу, что что-то происходит в разрушенной деятельности. Например. когда я добавить этот код на OnCreate:Активность Android живет после OnDestroy

 Task.Run(async() => { 
      while (true) { 
      System.Diagnostics.Debug.WriteLine("PING"); 
      await Task.Delay(1000); 
      } 
     }); 

, то я могу увидеть PING строку в выходной консоли даже после того, как OnDestroy называлась.

Когда я снова запускаю свою деятельность, я могу дважды увидеть строку PING. После очередного OnDestroy и повторного запуска активности каждая секунда имеет 3 PING-печати.

Что здесь происходит?

+2

Это происходит потому, что вы начинаете новую асинхронную задачу, которая живет независимо от жизненного цикла деятельности. Каждый раз, когда вы проходите через onCreate, вы создаете новую задачу. – z3n105

+0

1) Вы запускаете асинхронную задачу, которая (скорее всего) будет выполняться даже после завершения экземпляра 'Activity'; 2) когда 'onDestroy()' возвращает его [не означает, что его экземпляр будет немедленно завершен] (http://stackoverflow.com/questions/39562914/is-it-possible-for-a-callback-method-to- быть-востребованный после OnDestroy/39563751 # 39563751). – Onik

+0

Вы создаете утечку памяти. Плохо. Не делай этого. В onDestroy есть разработчики для очистки чего-либо, занимающегося активностью, и ваша задача Async явно держит ее. – Budius

ответ

1

Этот метод выше выполняет асинхронную задачу, которая по-прежнему сохраняется (поскольку это другой поток), даже если ваша деятельность уничтожена и она будет выполняться в будущем. Вы можете либо прервать/отменить его во время onDestroy, либо независимо от того, насколько вы считаете это нужным.

+1

Возможно, стоит упомянуть: способ выполнения операций в фоновом режиме - использовать службы Android. – Krumelur

1

Все темы Thread и AsyncronTasks, которые вы начали, работают до тех пор, пока они не закончится, даже если действие уничтожено.

Если вы хотите в изменении темы что-то на пользовательском интерфейсе, а затем вызвать if(!isDestroeyd()) перед тем

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