Что происходит с этим потоком, который можно запустить в конце после его завершения?

У меня есть этот поток, который загружает несколько изображений с сервера. Поэтому, как только он загружает изображения, я вызываю обработчик и продолжаю обновление пользовательского интерфейса. Так как stop() для потока устарел, я не могу его использовать. У меня есть два вопроса.

  1. Что происходит с этим потоком в конце? (то есть после того, как я вызываю метод-обработчик, что с ним происходит).
  2. ИЛИ как мне остановить этот поток без использования stop()?

Вот мой код.

handler=new Handler()
    {
        public void handleMessage(Message msg)
        {
            if(msg.what==0)
            {
                //UI Updation takes place. 
            }
        }
    };



final Thread t = new Thread(new Runnable() {
        public void run() {
            Log.i("Inside Thread", "Downloading Images...");
                     myDownlaodMethod();
            handler.sendEmptyMessage(0);
        }
    });
    t.start();

person Andro Selva    schedule 07.11.2011    source источник


Ответы (2)


Поток закончится и умрет сам по себе. Вы не должны заканчивать это сами. Вы не сможете перезапустить его без создания нового объекта Thread. Сборщик мусора будет обрабатывать любую память, которую необходимо освободить. Объект будет оставаться в памяти до тех пор, пока вы держите ссылку на него. Удалите ссылку, и сборщик мусора удалит объект, как и любой другой.

person DeeV    schedule 07.11.2011
comment
Так что, если в каком-то случае я захочу остановить эту нить посередине. Как мне это сделать в андроиде - person Andro Selva; 07.11.2011
comment
Если бы у него был постоянный цикл, вам нужно было бы иметь логическое условие, такое как while(a){// do everything }, и установить a в false, когда вы хотите, чтобы он умер. Если ваш myDownloadMethod() не может быть прерван и отменен, вам придется создать его или установить тайм-аут, чтобы просто позволить ему умереть. Вы не должны просто обрезать нить посреди ее выполнения. Лучшая практика - запустить его до конца. Очень часто для этой цели можно использовать Thread.interrupt(). - person DeeV; 07.11.2011
comment
Благодарю за разъяснение. - person Andro Selva; 07.11.2011
comment
@DeeV проверьте ExecutorService и Executors. Много думал об этих ребятах, и я часто видел, как разработчики повторно реализуют то, что делают эти классы. - person Adam Gent; 07.11.2011
comment
Это похоже на то, что может быть полезно для этого. Вероятно, это то, что обертывает AsyncTask, поскольку он работает аналогично. - person DeeV; 07.11.2011

Вы должны изучить ExecutorService и Исполнители.

Если это то же самое, что и обычная Java, то она обеспечивает мощное управление потоками, включая одновременное закрытие всех потоков.

person Adam Gent    schedule 07.11.2011
comment
Он использует Android, поэтому AsyncTask, вероятно, больше подходит, чем Executors. - person toto2; 16.07.2012
comment
Выключение потоков с помощью interrupt, как вы предлагаете, не является тривиальным, поскольку потоки должны быть изменены для правильной обработки прерываний. - person toto2; 16.07.2012
comment
@toto2 да, я согласен. Однако Anything лучше, чем просто Thread. Вы должны опубликовать ответ с помощью AsyncTask (в то время я об этом не знал). - person Adam Gent; 17.07.2012