Выполнение длительной операции в onDestroy

У меня есть "длительная" операция очистки, которую мне нужно выполнить в onDestroy() из моего Activity, Каков наилучший способ сделать это?

Если я использую Thread чтобы сделать это, мой onDestroy() вернется немедленно; но что происходит со ссылкой на тему? Я ищу совет относительно любых последствий / ошибок / отключений, которые мне нужно знать здесь, так как я предполагаю, что процесс все еще будет жив, даже после того, как Деятельность будет уничтожена.


Фон:

Я использую JmDNS в своем приложении. Когда пользователь завершит работу с моим приложением, я хочу очистить экземпляр JmDNS. Я делаю это, используя close() метод JmDNS учебный класс. Однако этот метод занимает более 5 секунд. В результате пользователь видит мой Activity в течение долгого времени после прикосновения к клавише Назад.

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

2 ответа

Решение

Я закончил тем, что делал то, что я спросил в вопросе - я начинаю Thread выполнить длительную операцию в onDestroy(),

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

Ваш вариант использования может отличаться - вы можете захотеть запустить поток очистки, только если он еще не запущен (используя Thread"s isAlive() метод или некоторая такая техника).

Вот пример кода. Чтобы оценить "очистить каждый экземпляр отдельно", выполните следующую последовательность действий:

  1. Запустите приложение
  2. Нажмите кнопку назад. Вы увидите операцию очистки в LogCat
  3. Перезапустите приложение.
  4. Снова выйдите из приложения. Теперь вы увидите два набора журналов очистки - первый представляет очистку для первого экземпляра; и второй набор, соответствующий второму экземпляру.

    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() когда ваша нить будет закончена.

Другие вопросы по тегам