我正在实现Xamarin Android位置跟踪器,并添加了以下代码来停止位置更新。
public Task StopAsync()
{
if(IsTracking)
{
IsTracking = false;
perviousStopTask = fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return perviousStopTask;
}
在上述方法中,我将RemoveLocationUpdatesAsync
方法的Task返回值分配给perviousStopTask
,然后从StopAsync
方法返回它。但是,当我尝试等待此StopAsync
方法时,它并没有完成。
答案 0 :(得分:1)
Xamarin LocationSample project将此问题归咎于Google Play服务。该示例当前在调用RemoveLocationUpdatesAsync
时不使用await。
TODO:我们应该等待此调用,但是在Google Play服务中似乎有一个错误,该错误首次调用removeLocationUpdates时,即使位置更新确实确实完成了,但返回的Android.Gms.Tasks.Task从未真正完成。删除并停止发生。目前,我们只是将其作为解决方法而忘却了。
答案 1 :(得分:0)
我不确定融合位置提供程序是否是线程安全的。但是,您可以尝试以下一些操作。
当null
为IsTracking
时,您似乎正在返回完成的或false
,所以我将方法更改为:
public Task StopAsync()
{
if (IsTracking)
{
IsTracking = false;
return fusedLocationProviderClient.RemoveLocationUpdatesAsync(this);
}
return Task.CompletedTask;
}
如果您真的不希望返回到从其调用方法的上下文,请确保调用.ConfigureAwait(false)
:
await StopAsync().ConfigureAwait(false);