Android Thread прерывается, когда уничтожение активности не работает - PullRequest
1 голос
/ 13 января 2012

Я новичок в разработке 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 я установил его как ложное.

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

public static Boolean is = true;

в теме:

while (is == true)....

OnDestroy:

is = false; 

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

Ответы [ 2 ]

3 голосов
/ 13 января 2012

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

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

public static volatile boolean is = true;
0 голосов
/ 13 января 2012

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

...