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

Ответить
Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

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

Сообщение Fry » 15 янв 2015, 10:29

Всем привет.

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

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 15 янв 2015, 16:33

Да это нормально. Ведь перед запуском потока вы его как демона не пометили?

myThread.setDaemon(true)

Если нет, то поток должен продолжить работу.
О том как правильно работать с потоками и как их лучше останавливать можете прочитать в умных книгах по Java, глава про потоки.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

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

Сообщение Fry » 15 янв 2015, 23:55

KamiSempai писал(а):Да это нормально. Ведь перед запуском потока вы его как демона не пометили?

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

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

Аватара пользователя
vitaliy
Сообщения: 44
Зарегистрирован: 10 янв 2015, 14:28
Откуда: Украина

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

Сообщение vitaliy » 16 янв 2015, 02:02

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

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

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

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

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

Сообщение Yurets » 16 янв 2015, 05:40

Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 16 янв 2015, 12:30

Yurets писал(а):Советую ещё глянуть простое популярное решение http://stackoverflow.com/questions/1470 ... -a-service
Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

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

Сообщение Yurets » 19 янв 2015, 04:57

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 19 янв 2015, 10:14

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 19 янв 2015, 12:21

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().
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить