Как работает кэш локаций? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть приложение, которое получает данные о местоположении GPS-устройств каждый раз, когда пользователь заполняет форму.Моя проблема в захвате местоположения GPS занимает слишком много времени.Для захвата GPS требуется от 40 до 60 секунд.Я использую плагин jamesmontemagno Geolocator .

Параметры GPS:Точность: 100 метровВремя ожидания: 1 минута

Вот мой код, который я сейчас использую:

var defaultgpsaccuracy = Convert.ToDouble(Preferences.Get("gpsaccuracy", String.Empty, "private_prefs"));
var defaultgpstimeout = Convert.ToDouble(Preferences.Get("gpstimeout", String.Empty, "private_prefs"));

var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = defaultgpsaccuracy;

position = await locator.GetLastKnownLocationAsync();

if (position != null)
{
     string location = position.Latitude + "," + position.Longitude;
     lblStartLocation.Text = location;
}
else
{
     position = await locator.GetPositionAsync(TimeSpan.FromMinutes(defaultgpstimeout), null, false);

     string location = position.Latitude + "," + position.Longitude;
     lblStartLocation.Text = location;
}

Это мои вопросы:

  1. Я использовал locator.GetLastKnownLocationAsync (); сколько времени до обновления кэша местоположений?
  2. И обновляется ли последнее известное местоположение при изменении местоположения
  3. И обновляется ли местоположение, когда устройства обновляютсяза пределами диапазона точности, например, точность 100 метров. Обновляется ли кэш местоположения, когда устройство находится вне диапазона 100 метров последнего известного местоположения?

1 Ответ

0 голосов
/ 10 июля 2019

Я бы настоятельно рекомендовал просмотреть документацию для этого конкретного плагина. Джеймс Монтемагно - известный и уважаемый разработчик, который использовал мою Microsoft для работы над платформой Xamarin, поэтому его плагины, расширения и инструментарий, как правило, довольно оптимизирован для использования в кроссплатформенных приложениях.

Глядя на документацию, становится ясно, что при попытке получить последнее «известное» местоположение обращается к внутреннему кешированному набору данных о местоположении и не обязательно оптимизируется для запросов почти в реальном времени. Однако его можно использовать для уменьшения количества фактических запросов местоположения, которые вы должны выполнять в приложении.

Полный фрагмент из связанной документации выглядит следующим образом:

public async Task<Position> GetCurrentLocation()
{
   public static async Task<Position> GetCurrentPosition()
    {
            Position position = null;
            try
            {
                    var locator = CrossGeolocator.Current;
                    locator.DesiredAccuracy = 100;

                    position = await locator.GetLastKnownLocationAsync();

                    if (position != null)
                    {
                            //got a cahched position, so let's use it.
                            return position;
                    }

                    if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled)
                    {
                            //not available or enabled
                            return null;
                    }

                    position = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true);

            }
            catch (Exception ex)
            {
                    Debug.WriteLine("Unable to get location: " + ex);
            }

            if (position == null)
                    return null;

            var output = string.Format("Time: {0} \nLat: {1} \nLong: {2} \nAltitude: {3} \nAltitude Accuracy: {4} \nAccuracy: {5} \nHeading: {6} \nSpeed: {7}",
                    position.Timestamp, position.Latitude, position.Longitude,
                    position.Altitude, position.AltitudeAccuracy, position.Accuracy, position.Heading, position.Speed);

            Debug.WriteLine(output);

            return position;
    }
}

Этот метод разработан в соответствии с иерархическим шаблоном поиска местоположения, он начинается с последней «известной» позиции и запрашивает, если необходимо, вы можете сделать это еще дальше и добавить тайм-аут для проверки кэшированного местоположения, если ты хотел.

Что касается того, как часто обновляются эти данные, я бы отсылал вас к разделу документации , озаглавленному «Фоновые обновления»

Джеймс говорит о приложении для вождения, как пример того, как это работает. Обновление выполняется по-разному для Android и iOS, но вот фрагмент, касающийся Android:

Для этого вы захотите интегрировать службу переднего плана, которая подписывается на изменения местоположения, и пользовательский интерфейс связывается с. пожалуйста Прочитайте документацию Xamarin.Android Services

В примере кода, который он использует, он показывает вам, как создать «слушателя», который будет периодически проверять изменения местоположения. Это может лучше соответствовать тому, что вы пытаетесь сделать, в зависимости от цели вашего приложения.

...