На Android действуют те же правила, что и в обычной среде Java. В Java потоки не уничтожаются, но остановка потока выполняется совместно . Требуется завершить поток, после чего он может корректно завершить работу.
Часто используется volatile boolean
поле, которое поток периодически проверяет и завершает работу, когда для него установлено соответствующее значение.
Я бы не стал использовать a, boolean
чтобы проверять, следует ли завершать поток . Если вы используете volatile
в качестве модификатора поля, это будет работать надежно, но если ваш код станет более сложным, поскольку вместо этого используются другие методы блокировки внутри while
цикла, может случиться так, что ваш код вообще не завершится или, по крайней мере, займет больше времени, чем вы может захотеть.
Некоторые методы библиотеки блокировки поддерживают прерывание.
Каждый поток уже имеет состояние прерывания логического флага, и вы должны его использовать. Реализовать это можно так:
public void run() {
try {
while(!Thread.currentThread().isInterrupted()) {
}
} catch (InterruptedException consumed)
}
}
public void cancel() { interrupt(); }
Исходный код взят из Java Concurrency in Practice . Посколькуcancel()
метод является общедоступным, вы можете позволить другому потоку вызывать этот метод по своему усмотрению.
Существует также статический метод с плохим именем, interrupted
который очищает прерванный статус текущего потока.