На 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который очищает прерванный статус текущего потока.