Каков наилучший способ ждать определения местоположения GPS? - PullRequest
5 голосов
/ 06 апреля 2010

Используя мое приложение для Android, когда пользователь выполняет определенное действие, запускается фоновая служба, которая выбирает текущее местоположение GPS и сохраняет его в базе данных в дополнение к другим действиям. В этом сервисе я использую requestLocationUpdates() из класса LocationManager и жду, пока не будет запущен onLocationChanged() моего LocationListener (который реализован сервисом). Но каков наилучший способ дождаться стрельбы onLocationChanged? Стоит ли просто опрашивать переменную и ждать, пока она не будет установлена? Любые советы?

Примечание: я не могу просто записать в базу данных в onLocationChanged() из-за некоторых других вещей.

РЕДАКТИРОВАТЬ: Чтобы прояснить мою ситуацию, я могу привести пример, похожий на мой случай: Допустим, пользователь нажимает кнопку и запускается метод myMethod, который возвращает некоторый объект. Затем в этом myMethod я буду регистрироваться для получения обновлений местоположения от GPS (используя requestLocationChanged) и, кроме того, буду ждать местоположение пользователей и использовать его для чего-то. Другими словами, myMethod не может вернуться, пока не будет указано местоположение. Я не знаю, как я могу использовать onLocationChanged в этом случае.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

Когда местоположение задано, запускается onLocationChanged, поэтому вам не нужно опрашивать какую-либо переменную. Почему вы не можете сохранить местоположение в onLocationChanged?

0 голосов
/ 31 августа 2012

В зависимости от моего понимания вопроса и чтения комментариев, я бы посоветовал вам взять начальное местоположение, используя getLastKnownLocation() из LocationManager класса. Также зарегистрируйтесь на событие onLocationChanged. Теперь вы можете делать все, что захотите, в этой функции обработчика событий, продолжая работу в интерфейсе. Кроме того, если вам нужно настоящее местоположение, вы можете дождаться ответа requestLocationUpdates(). Вероятно, не стоит заставлять пользователя ждать, пока ваше приложение готовится к какой-либо задаче. Как предлагают другие, вы можете использовать индикатор выполнения здесь.

0 голосов
/ 06 апреля 2010

Я думаю, вы должны использовать методы ожидания / уведомления. У вас должен быть какой-нибудь объект блокировки. Вы вызываете lockObject.wait () в вашем методе. И вы вызываете lockObject.notify () в onLocationChanged. Таким образом, ваш метод не вернется, пока не получено onLocationChanged.

На самом деле лучшим решением было бы проверить ваш дизайн и сделать ваш метод асинхронным, если это возможно.

0 голосов
/ 06 апреля 2010

Что я делаю, так это устанавливаю представление на главном экране на индикатор выполнения неопределенной длины, устанавливаю requestLocationUpdates () и просто возвращаюсь обратно пользователю. Если вам нужно заблокировать пользователя до тех пор, пока местоположение не будет разрешено, вы можете открыть диалоговое окно в верхней части своей деятельности, которое не имеет элементов управления и представления индикатора выполнения. Затем в обратном вызове onLocationChanged вы можете закрыть этот диалог и продолжить свою деятельность.

РЕДАКТИРОВАТЬ: я прочитал ваш вопрос еще раз, и я думаю, что я понимаю лучше. Моим первым предложением было бы посмотреть, сможете ли вы покончить с фоновой службой. Вам не нужно беспокоиться о том, что приложение перестанет отвечать на запросы в ожидании блокировки GPS, поскольку GPS API является асинхронным. Если по какой-либо причине вы не можете этого сделать, то вам придется обратиться к API передачи сообщений, чтобы фоновая служба могла отправлять сообщение в вашу основную активность, когда доступны данные GPS. См. Руководство для разработчиков .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...