Страница 1 из 1

Остановка отдельного потока сервиса

Добавлено: 15 янв 2015, 10:29
Fry
Всем привет.

1. Запускаю сервис в отдельном потоке.
2. Останавливаю сервис через stopSelf(). В сервисе срабатывает метод onDestroy().
3. Потока сервиса не убивается и продолжает отсвечивать в ADM.

Нужно ли отдельно убивать потока сервиса в этой ситуации?
Это нормально, что он продолжает работать?

Re: Остановка отдельного потока сервиса

Добавлено: 15 янв 2015, 16:33
KamiSempai
Да это нормально. Ведь перед запуском потока вы его как демона не пометили?

myThread.setDaemon(true)

Если нет, то поток должен продолжить работу.
О том как правильно работать с потоками и как их лучше останавливать можете прочитать в умных книгах по Java, глава про потоки.

Re: Остановка отдельного потока сервиса

Добавлено: 15 янв 2015, 23:55
Fry
KamiSempai писал(а):Да это нормально. Ведь перед запуском потока вы его как демона не пометили?

myThread.setDaemon(true)
.
А где и как это сделать, если процесс помечается таковым в манифесте? И что это даст?

Я правильно понимаю, что такой ненужный процесс система сама убьет, и это проблемой не является?

Re: Остановка отдельного потока сервиса

Добавлено: 16 янв 2015, 02:02
vitaliy
Fry писал(а):
KamiSempai писал(а):Да это нормально. Ведь перед запуском потока вы его как демона не пометили?

myThread.setDaemon(true)
.
А где и как это сделать, если процесс помечается таковым в манифесте? И что это даст?

Я правильно понимаю, что такой ненужный процесс система сама убьет, и это проблемой не является?
Потоки демоны удаляются в то же время, когда удаляется поток родитель. Часто используется для анимации.

Re: Остановка отдельного потока сервиса

Добавлено: 16 янв 2015, 05:40
Yurets
Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service

Re: Остановка отдельного потока сервиса

Добавлено: 16 янв 2015, 12:30
KamiSempai
Yurets писал(а):Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service
Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.

Re: Остановка отдельного потока сервиса

Добавлено: 19 янв 2015, 04:57
Yurets
KamiSempai писал(а):
Yurets писал(а):Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service
Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
Да, но interrupt может и не остановить поток. При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...

Re: Остановка отдельного потока сервиса

Добавлено: 19 янв 2015, 10:14
Mikhail_dev
При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Угу. если мы к примеру стоим на блокирующем методе и читаем какие-нибудь данные через сокет, то мы не дойдём до места где можем проверить условие isInterrupted

Re: Остановка отдельного потока сервиса

Добавлено: 19 янв 2015, 12:21
KamiSempai
Yurets писал(а):
KamiSempai писал(а):
Yurets писал(а):Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service
Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
Да, но interrupt может и не остановить поток. При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Хм, а установка "running = false" разве не может быть проигнорировано? Это же тоже посылка сообщение "Поток остановись". Тут все зависит от прямоты рук.
Mikhail_dev писал(а):
При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Угу. если мы к примеру стоим на блокирующем методе и читаем какие-нибудь данные через сокет, то мы не дойдём до места где можем проверить условие isInterrupted
Для остановки сетевых операций есть свои механизмы. Вот, например, для HttpUriRequest http://developer.android.com/reference/ ... ml#abort().