Я внедряю трекер местоположения Android Xamarin и добавил следующий код, чтобы остановить обновления местоположения.
public Task StopAsync()
{
if(IsTracking)
{
IsTracking = false;
perviousStopTask = fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return perviousStopTask;
}
Выше метода я назначаю возвраты Task из метода RemoveLocationUpdatesAsync
на perviousStopTask
и возвращаю его из метода StopAsync
. Но когда я пытаюсь дождаться этого метода StopAsync
он не завершается.
Проект Xamarin LocationSample возлагает вину на Google Play Services за эту проблему. В настоящее время образец не использует await при вызове RemoveLocationUpdatesAsync
.
TODO: нам следует дождаться этого вызова, но в сервисах Google Play, по-видимому, есть ошибка, из-за которой при первом вызове removeLocationUpdates возвращенный Android.Gms.Tasks.Task фактически никогда не завершается, хотя обновления местоположения, похоже, удаляются и останавливаются происходит. А пока мы просто уволим и забудем как обходной путь.
Я не уверен, является ли провайдер локализованного хранилища потокобезопасным или нет. Тем не менее, вы можете попробовать некоторые из следующих вещей.
Похоже, вы возвращаете заполненный или null
, когда IsTracking
является false
, так что я бы изменить метод:
public Task StopAsync()
{
if (IsTracking)
{
IsTracking = false;
return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return Task.CompletedTask;
}
Если вы на самом деле не заинтересованы в возврате к контексту, из которого вы вызвали метод, убедитесь, что вы вызываете .ConfigureAwait(false)
:
await StopAsync().ConfigureAwait(false);