Сервис Android, жизненный цикл и темы

1

Я работаю над сервисом, который расширяет класс Service и использует отдельный поток для обработки входящих сообщений, поэтому в моем методе onCreate у меня есть следующее:

thread = new HandlerThread("MYSERVICE-THREAD",
        Process.THREAD_PRIORITY_BACKGROUND);

thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(mServiceLooper);

В этом потоке я создаю LocationManager и настраивает его для прослушивания изменений местоположения. Однако я немного обеспокоен жизненным циклом потока. Вот почему:

Если я не удаляю прослушивателей местоположений из диспетчера местоположений в методе onDestroy службы и принудительное обновление местоположения через telnet, все работает нормально. Я нашел это странным и попытался явно кончить поток с помощью thread.quit() в методе onDestroy службы. Итак, теперь, когда я делаю обновление местоположения из telnet, я получаю предупреждение, которое я ожидал в первую очередь. То, что обработчик вызывал обработчик на мертвой нити.

удаление диспетчеров местоположения, очевидно, решает это, НО, похоже, мне кажется, что если я не буду явно закрывать поток, поток будет продолжать работать после уничтожения службы. Это верно? В примерах на developer.android.com они явно не закрывают поток, поэтому я думал, что VM позаботится об этом в этом случае.

Теги:
multithreading

2 ответа

3
Лучший ответ

О да. В этом случае. То же самое относится и к деятельности. Темы остаются открытыми до тех пор, пока Android явно не убьет их, чтобы освободить ресурсы, если вы их сами не закроете. В техническом смысле, действия и службы никогда не закрываются при выталкивании из стека. Он просто сообщает ОС, что все ресурсы, которые они используют, теперь могут быть восстановлены, когда это необходимо, чтобы пул памяти был первым местом, на котором смотрит ОС. Если поток любого типа все еще работает, он будет продолжать работать (и обрабатывать ресурсы ЦП) до тех пор, пока не будет восстановлена память, которая может находиться где-то между 1 секундой и вечностью.

  • 0
    спасибо, это было наиболее информативно :)
2

это, кажется, намекает мне, что если я не буду явно закрывать поток, поток будет продолжать работать после уничтожения службы. Это верно?

Абсолютно. Если вы разветвляете поток, вы должны его очистить.

поэтому я думал, что VM позаботится об этом в этом случае.

В конце концов, это будет, поскольку ОС в конечном итоге прекратит весь процесс для вашего приложения. При этом вы не хотите просачивать потоки, и вы действительно не хотите просачивать requestLocationUpdates() (или что бы то ни было, что вы используете с LocationManager), поскольку это может привести к включению поставщика местоположения (например, GPS).

В примерах на developer.android.com они явно не закрывают поток

На каких примерах вы ссылаетесь?

  • 1
    Спасибо :) Пример, на который я ссылался, это пример «Расширения класса обслуживания»: developer.android.com/guide/topics/fundamentals/services.html , не будет ли это порождать новый поток каждый раз, когда сервис называется, и никогда не убирать за собой? (или stopSelf (msgid) имеет значение?)
  • 1
    @JustDanyul: я подозреваю, что это ошибка в образце. Я подал вопрос об этом: code.google.com/p/android/issues/detail?id=32284

Ещё вопросы

Сообщество Overcoder
Наверх
Меню