Выполнение длительной операции в onDestroy
У меня есть "длительная" операция очистки, которую мне нужно выполнить в onDestroy()
из моего Activity
, Каков наилучший способ сделать это?
Если я использую Thread
чтобы сделать это, мой onDestroy()
вернется немедленно; но что происходит со ссылкой на тему? Я ищу совет относительно любых последствий / ошибок / отключений, которые мне нужно знать здесь, так как я предполагаю, что процесс все еще будет жив, даже после того, как Деятельность будет уничтожена.
Фон:
Я использую JmDNS в своем приложении. Когда пользователь завершит работу с моим приложением, я хочу очистить экземпляр JmDNS. Я делаю это, используя close()
метод JmDNS
учебный класс. Однако этот метод занимает более 5 секунд. В результате пользователь видит мой Activity
в течение долгого времени после прикосновения к клавише Назад.
Мне еще предстоит выяснить, почему close()
Это занимает много времени, но в то же время я также понял, что мне действительно не нужно ждать успешного завершения закрытия. Все, что мне нужно, это способ "закрыть" закрытие и покончить с этим.
2 ответа
Я закончил тем, что делал то, что я спросил в вопросе - я начинаю Thread
выполнить длительную операцию в onDestroy()
,
Один случай, который я должен был рассмотреть, - это когда пользователь снова открывает мое приложение еще до того, как длительный запуск завершился. В моем приложении это означает, что создается новый экземпляр JmDNS. Итак, я очищаю каждый экземпляр отдельно в моем onDestroy
,
Ваш вариант использования может отличаться - вы можете захотеть запустить поток очистки, только если он еще не запущен (используя Thread
"s isAlive()
метод или некоторая такая техника).
Вот пример кода. Чтобы оценить "очистить каждый экземпляр отдельно", выполните следующую последовательность действий:
- Запустите приложение
- Нажмите кнопку назад. Вы увидите операцию очистки в LogCat
- Перезапустите приложение.
Снова выйдите из приложения. Теперь вы увидите два набора журналов очистки - первый представляет очистку для первого экземпляра; и второй набор, соответствующий второму экземпляру.
public class DelayedExitActivity extends Activity { private static final String LOG_TAG = "DelayedExit"; private final Runnable longOperation = new Runnable(){ @Override public void run() { for (int i=0 ; i < 50; i++){ Log.d(LOG_TAG, "Iteration "+i); try { Thread.sleep(2 * 1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; private Thread longThread ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onDestroy() { if(longThread == null){ longThread = new Thread(longOperation); } longThread.start(); super.onDestroy(); } }
Попробуйте начать свою тему в onBackPressed()
и позвонить destroy()
когда ваша нить будет закончена.