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. Если вы написали какой-либо код, он продолжит выполнение, и как только он достигнет конца кода вашего потока, поток остановится сам по себе.