Страница 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
Re: Остановка отдельного потока сервиса
Добавлено: 16 янв 2015, 12:30
KamiSempai
Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
Re: Остановка отдельного потока сервиса
Добавлено: 19 янв 2015, 04:57
Yurets
KamiSempai писал(а):Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
Да, но interrupt может и не остановить поток. При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Re: Остановка отдельного потока сервиса
Добавлено: 19 янв 2015, 10:14
Mikhail_dev
При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Угу. если мы к примеру стоим на блокирующем методе и читаем какие-нибудь данные через сокет, то мы не дойдём до места где можем проверить условие isInterrupted
Re: Остановка отдельного потока сервиса
Добавлено: 19 янв 2015, 12:21
KamiSempai
Yurets писал(а):KamiSempai писал(а):Я тоже так раньше делал, пока не понял, что вместо этого можно легко использовать interrupt.
Да, но interrupt может и не остановить поток. При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Хм, а установка "running = false" разве не может быть проигнорировано? Это же тоже посылка сообщение "Поток остановись". Тут все зависит от прямоты рук.
Mikhail_dev писал(а):При вызове этого метода поток просто получает сообщение "Поток остановись", но в отдельных случаях это сообщение может быть проигнорировано...
Угу. если мы к примеру стоим на блокирующем методе и читаем какие-нибудь данные через сокет, то мы не дойдём до места где можем проверить условие isInterrupted
Для остановки сетевых операций есть свои механизмы. Вот, например, для HttpUriRequest
http://developer.android.com/reference/ ... ml#abort().