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

Я новичок в разработке 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; 

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

2 ответа

Решение

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

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

public static volatile boolean is = true;

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

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