Используя мое приложение Android, когда пользователь делает определенные действия, фоновый сервис запускается, который выбирает текущее местоположение GPS и сохраняет его в базе данных, кроме того, выполнения некоторого другого материала. В том сервисе я использую requestLocationUpdates()
от LocationManager
класс и ожидает до onLocationChanged()
из моего LocationListener
(который реализован сервисом), запущен. Но что лучший способ состоит в том, чтобы ожидать onLocationChanged
стрелять? Я должен просто опросить на переменной и ожидать, пока она не установлена? Какие-либо подсказки?
Примечание: Я не могу просто записать в базу данных в onLocationChanged()
из-за некоторого другого материала.
Править: К clearfy моя ситуация я могу представить пример, подобный моему случаю: Скажем, пользователь нажимает кнопку и метод myMethod
запущен, который возвратит некоторый объект. Затем в этом myMethod я зарегистрируюсь для обновлений информации о местоположении от GPS (использование requestLocationChanged
) и, кроме того, ожидайте пользовательского местоположения и используйте его для чего-то. Другими словами, myMethod
не может возвратиться, прежде чем местоположение присутствует. Я не знаю, как я могу использовать onLocationChanged
в этом случае.
Что я делаю, так это устанавливаю вид на главном экране на индикатор выполнения неопределенного length, установите requestLocationUpdates () и просто вернитесь обратно пользователю.Если вам нужно заблокировать пользователя до тех пор, пока местоположение не будет определено, вы можете открыть диалоговое окно поверх своей активности, в котором нет элементов управления и представление индикатора выполнения. Затем в обратном вызове onLocationChanged вы можете закрыть этот диалог и продолжить свой бизнес.
РЕДАКТИРОВАТЬ: Я снова прочитал ваш вопрос и, кажется, понял лучше. Мое первое предложение - посмотреть, сможете ли вы избавиться от фоновой службы. Вам не нужно беспокоиться о том, что приложение перестает отвечать в ожидании блокировки GPS, потому что API GPS является асинхронным. Если по какой-либо причине вы не можете этого сделать, вам придется взглянуть на API передачи сообщений, чтобы ваша фоновая служба могла отправлять сообщение в ваше основное действие, когда данные GPS доступны. См. Руководство разработчика .
Я думаю, вам следует использовать методы ожидания / уведомления. У вас должен быть какой-то объект блокировки. Вы вызываете lockObject.wait () в своем методе. И вы вызываете lockObject.notify () в onLocationChanged. Таким образом, ваш метод не вернется, пока не будет получен onLocationChanged.
На самом деле лучшим решением было бы пересмотреть ваш проект и сделать ваш метод асинхронным, если это возможно.
Когда местоположение установлено, запускается onLocationChanged, поэтому вам не нужно опрашивать какую-либо переменную. Почему вы не можете сохранить местоположение в onLocationChanged?