Сервис Android с обратными вызовами locationListener - PullRequest
2 голосов
/ 19 сентября 2010

У меня есть приложение для Android.Основываясь на текущем географическом местоположении пользователя, я хочу получить некоторые удаленные данные в фоновом режиме и сохранить их.Моя реализация:

Через определенный промежуток времени мой сервис вызывает тревогу.Сервис использует анонимный класс для запроса текущего местоположения и регистрирует обратный вызов locationListener.При вызове onLocationChanged () я инициирую удаленную выборку данных с сервера.

Однако, как только мой сервис завершил регистрацию слушателя местоположения с использованием класса anonymos, он возвращается, как ожидалось;так как он не ждет обратного вызова, прежде чем закончить.Поскольку обратный вызов занимает некоторое время и делает вызов, когда служба уже вернулась, он выдает ошибку, говорящую:

java.lang.RuntimeException: Handler{43e82510} sending message to a Handler on a dead thread

Что вполне понятно.Один быстрый обходной путь для меня сейчас заключается в том, что я могу использовать getLastKnownLocation из locationManager, поскольку он не отвечает обратным вызовом;но что, если я действительно хочу получить последнее местоположение прямо сейчас, в сервисе, а не в активности?Как я могу дождаться, когда произойдет обратный вызов, и остановить возвращение моего сервиса.

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

Любая помощь очень ценится.Приветствия

1 Ответ

4 голосов
/ 19 сентября 2010

но что, если мне действительно нужно последнее местоположение прямо сейчас, в сервисе, а не в активности?

Извините, но это невозможно, ни в сервисе, ни в активности.Например, если GPS-радио выключено, и вы запрашиваете данные о местоположении у GPS, потребуется всего несколько десятков секунд, чтобы получить исправление, и это если вам повезет.Это может вообще не исправить.

Как я могу дождаться обратного вызова и остановить возврат моего сервиса.

Нет.Вы делаете то, что сказали, что сделаете:

используйте getLastKnownLocation из locationManager, поскольку он не отвечает обратным вызовом

Итак, получите Service (чтонадеюсь, IntentService) проверит, имеет ли значение getLastKnownLocation() значение.Если это так, используйте его.В противном случае, registerLocationUpdates(), используя PendingIntent, который передаст управление вашему IntentService.Когда вы получите , что Intent, используйте местоположение и отмените регистрацию для обновлений (при условии, что период тревоги хороший и длинный, как, скажем, один раз в час).

Все становится сложнее, еслиВаша тревога - тревога _WAKEUP.Затем вам нужно будет удерживать WakeLock, чтобы устройство не засыпало, пока вы пытаетесь получить GPS-фикс.Тем не менее, вам нужно выпустить это WakeLock когда-нибудь, и если мы не сможем исправить GPS ... ммм ... ну, это сложная часть.Попытка найти хороший и понятный способ справиться с этим и реализовать его как компонент многократного использования (например, LocationAlarmService) - это один из 18 000 пунктов в моем списке дел.

Кроме того,в какой момент происходит обновление lastKnownlocation?GPS каждый раз регистрирует новое местоположение;он обновляет его?

AFAIK, да.

...