FusedLocationProviderClient RemoveLocationUpdatesAsync Задача не выполнена - PullRequest
1 голос
/ 18 марта 2019

Я реализую трекер местоположения Android Xamarin и добавил следующий код для остановки обновлений местоположения.

    public Task StopAsync()
    {
        if(IsTracking)
        {
            IsTracking = false;
            perviousStopTask = fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
        }

        return perviousStopTask;
    }

Выше метода я назначаю возвраты Task из метода RemoveLocationUpdatesAsync для perviousStopTask и возвращаю его из StopAsync метод.Но когда я пытаюсь дождаться этого StopAsync метода, он не завершается.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Проект Xamarin LocationSample возлагает вину на сервисы Google Play за эту проблему. В данный момент образец не использует await при вызове RemoveLocationUpdatesAsync.

TODO: нам следует дождаться этого вызова, но в сервисах Google Play, по-видимому, есть ошибка, из-за которой при первом вызове removeLocationUpdates возвращенный Android.Gms.Tasks.Task фактически никогда не завершается, хотя обновления местоположения, похоже, действительно происходят. удалены и перестать происходить. А пока мы просто запустим и забудем как обходной путь.

0 голосов
/ 19 марта 2019

Я не уверен, является ли провайдер локализованного хранилища потокобезопасным или нет. Тем не менее, вы можете попробовать некоторые из следующих вещей.

  1. Похоже, что вы возвращаете заполненный или null, когда IsTracking равен false, поэтому я бы изменил метод на:

    public Task StopAsync()
    {
        if (IsTracking)
        {
            IsTracking = false;
            return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
        }
    
        return Task.CompletedTask;
    }
    
  2. Если вы на самом деле не заинтересованы в возврате к контексту, из которого вы вызвали метод, убедитесь, что вы вызываете .ConfigureAwait(false):

    await StopAsync().ConfigureAwait(false);
    
...