2010-09-18 6 views
2

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

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

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

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

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

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

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

ответ

4

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

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

Как подождать, пока произойдет обратный вызов, и прекратите мой сервис.

У вас нет. Вы делаете то, что вы сказали, что вы должны сделать следующее:

использовать getLastKnownLocation из locationManager как не реагирует обратно обратного вызова

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

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

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

AFAIK, да.

+1

Большое спасибо, что прояснил многое для меня. По крайней мере, это вновь подтверждает убеждение, что я не единственный, кто не может этого понять. :) – Priyank

+0

Сообщите мне, когда вы пройдете список дел. Кроме того, служба определения местоположения Google Play может оказаться полезной для приобретения местоположения. – Ragnar123