Изменить: Я переписываю этот вопрос, потому что я, по-видимому, не был ясен.
Иногда служба GPS на телефонах Android занимает много времени, чтобы исправить ситуацию. Иногда это быстро, иногда это занимает несколько часов. Я знаю и принимаю это.
У меня есть приложение, которое делает много вещей. Одна из вещей, которую он должен сделать, это позволить пользователю нажать кнопку, чтобы отправить свои текущие координаты на сервер. Мне нужны координаты телефона , когда пользователь нажимает кнопку или в течение относительно короткого времени после этого.
Поскольку я знаю, что получение GPS-исправления не является мгновенным, и я знаю, что это может занять несколько минут или часов (в течение которых пользователь переместился на большое расстояние), мне нужно закодировать тайм-аут для этой функции. Для этой функции просто неприемлемо загружать GPS-местоположение пользователя три минуты (например) после нажатия кнопки. Это нормально, если требуется 45 секунд, не так, если требуется 75 секунд. Это прекрасно, чтобы дать пользователю уведомление об ошибке, если функция не смогла получить местоположение достаточно быстро.
Мне нужна функция, чтобы "получить местоположение GPS и отправить его на сервер, , если это занимает более одной минуты".
Мой исходный код приведен ниже. Я изменил некоторые вещи после публикации. Я добавил таймер в метод onStartCommand(). Я запускаю TimerTask, который через 60 секунд вызовет мой метод stop(). В начале метода onLocationChanged() я отменяю TimerTask.
Мой вопрос: Является ли схема таймера хорошим способом реализации этого таймаута? Есть ли лучший способ?
Оригинальный вопрос:
Я пишу приложение для Android, которое, помимо прочего, должно отправлять текущие координаты GPS на сервер, когда пользователь сообщает об этом. В контекстном меню я запускаю службу ниже. Служба - это LocationListener и запрашивает обновления из LocationManager. Когда он получает местоположение (onLocationChanged()), он удаляет себя в качестве слушателя и отправляет координаты на сервер. Все это работает.
Однако, если координаты GPS не будут быстро доступны, мой сервис просто продолжает работать, пока он не получит некоторые. Он поддерживает пользовательский интерфейс с диалоговым окном прогресса, который раздражает. Хуже того, если пользователь перешел с момента запуска службы, первые GPS-координаты могут быть неправильными, и приложение отправит плохие данные на сервер.
Мне нужен тайм-аут в сервисе. Есть ли хороший способ сделать это? Я не очень разбираюсь в потоках. Я думаю, что я могу запустить Runnable в методе onStartCommand(), который каким-то образом будет отсчитывать 30 секунд, а затем, если результат GPS еще нет, вызовите мой метод stop(). Это звучит как лучший способ сделать это?
В качестве альтернативы можно ли определить, не может ли GPS получить исправление? Как мне это сделать?
Изменить: Чтобы уточнить, я ищу лучший способ "отказаться" от получения местоположения через некоторое время.
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}