Выполнение длительной операции в onDestroy - PullRequest
6 голосов
/ 28 февраля 2012

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

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


Справочная информация:

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

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

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

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

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

Ваш вариант использования может отличаться - вы можете запустить поток очистки только в том случае, если он еще не запущен (с использованием Thread 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();
        }
    }
    
0 голосов
/ 28 февраля 2012

Попробуйте начать свою тему в onBackPressed() и позвоните destroy(), когда ваша тема будет закончена.

...