Прерывание потока Android, когда уничтожение активности не работает

Я новичок в разработке Android. У меня есть действие, в котором я создаю поток для загрузки изображения и обновления его в imageView. Поток выполняет «бесконечный цикл». Я также хочу остановить поток, когда действие остановлено. Ниже вы можете увидеть пример того, что я реализовал, но он выдает исключение, и поток продолжает работать, или приложение аварийно завершает работу. Какие-либо предложения?

public class myActivity extends Activity{

   Thread tr;


   .... onCreate(){
        bla bla bla

        tr = new Thread();
        tr.start();
   }

   .....onDestroy(){
        tr.interupt();
   }

   bla bla bla
}

Извините, что не написал полный код, но я сейчас не дома, где у меня есть код. Что я должен изменить, чтобы он перестал работать?

Я также попробовал еще один трюк, где я установил общедоступное статическое логическое значение, а onDestroy установил его как false.

В потоке "бесконечный цикл" работает как:

public static Boolean is = true;

в теме:

while (is == true)....

onDestroy:

is = false; 

Итак, с помощью этого трюка, поскольку цикл завершится, будет ли поток уничтожен, когда он завершит свою работу?


person Panos    schedule 13.01.2012    source источник


Ответы (2)


Поток завершается, когда его метод run завершает выполнение. Поэтому, если вы прервете цикл while, установив boolean в false, а затем элемент управления достигнет конца run, поток обязательно завершится. На самом деле это рекомендуемый способ остановки потока в java.

Один важный момент, который вы должны помнить, это всегда устанавливать переменные, которые изменяются одним потоком и считываются другим потоком, как volatile, чтобы предотвратить поломку вашего кода оптимизациями, такими как кэширование переменных:

public static volatile boolean is = true;
person Tudor    schedule 13.01.2012

Не решайте свою проблему, используя первый подход. Этот подход не рекомендуется в документации по java-потокам. Ваш второй подход — лучший способ выполнить эту работу. Теперь во втором подходе, когда вы делаете свою переменную «is» ложной в методе onDestroy, это немедленно разорвет цикл while внутри вашего потока. Теперь, после этого цикла while. Если вы написали какой-либо код, он продолжит выполнение, и как только он достигнет конца кода вашего потока, поток остановится сам по себе.

person vishnu pratap singh    schedule 13.01.2012
comment
Спасибо чувак. Но что, если у меня есть случай, когда я не могу использовать свой второй подход. Как мне остановить поток? - person Panos; 13.01.2012
comment
Я думаю, что вы всегда должны использовать второй подход. Может быть, вы можете просмотреть документы Java в потоках, чтобы получить более четкое представление о том, почему вам не следует использовать первый подход. и я думаю, что все, что вы пытаетесь сделать с первым подходом, можно сделать и со вторым подходом - person vishnu pratap singh; 13.01.2012