FusedLocationProviderClient RemoveLocationUpdatesAsync Задача не выполнена

1

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

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

        return perviousStopTask;
    }

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

Теги:
xamarin
xamarin.android
task

2 ответа

0

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

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

0

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

  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);
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню