Я работаю над сервисом, который расширяет класс 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 позаботится об этом в этом случае.
О да. В этом случае. То же самое относится и к деятельности. Темы остаются открытыми до тех пор, пока Android явно не убьет их, чтобы освободить ресурсы, если вы их сами не закроете. В техническом смысле, действия и службы никогда не закрываются при выталкивании из стека. Он просто сообщает ОС, что все ресурсы, которые они используют, теперь могут быть восстановлены, когда это необходимо, чтобы пул памяти был первым местом, на котором смотрит ОС. Если поток любого типа все еще работает, он будет продолжать работать (и обрабатывать ресурсы ЦП) до тех пор, пока не будет восстановлена память, которая может находиться где-то между 1 секундой и вечностью.
это, кажется, намекает мне, что если я не буду явно закрывать поток, поток будет продолжать работать после уничтожения службы. Это верно?
Абсолютно. Если вы разветвляете поток, вы должны его очистить.
поэтому я думал, что VM позаботится об этом в этом случае.
В конце концов, это будет, поскольку ОС в конечном итоге прекратит весь процесс для вашего приложения. При этом вы не хотите просачивать потоки, и вы действительно не хотите просачивать requestLocationUpdates()
(или что бы то ни было, что вы используете с LocationManager
), поскольку это может привести к включению поставщика местоположения (например, GPS).
В примерах на developer.android.com они явно не закрывают поток
На каких примерах вы ссылаетесь?