我正在实施Xamarin Android Location跟踪器,并添加了以下代码来停止位置更新。
public Task StopAsync()
{
if(IsTracking)
{
IsTracking = false;
perviousStopTask = fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return perviousStopTask;
}
上面的方法,我将任务返回从RemoveLocationUpdatesAsync
方法分配给perviousStopTask
并从StopAsync
方法返回它。但是,当我试图等待这个StopAsync
方法时,它没有完成。
Xamarin LocationSample project将此问题归咎于Google Play服务。调用RemoveLocationUpdatesAsync
时,样本当前不会使用等待。
TODO:我们应该等待这个电话,但Google Play服务中似乎有一个错误,第一次调用removeLocationUpdates,返回的Android.Gms.Tasks.Task永远不会真正完成,即使位置更新似乎已被删除并停止发生。现在我们只是解雇并忘记解决方法。
我不确定Fused Location Provider是否是线程安全的。但是,您可以尝试以下某些操作。
null
是IsTracking
时,似乎你正在返回一个完整的或false
,所以我会将方法更改为:
public Task StopAsync()
{
if (IsTracking)
{
IsTracking = false;
return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return Task.CompletedTask;
}
.ConfigureAwait(false)
:
await StopAsync().ConfigureAwait(false);