我想在 Xamarin CrossPlatform 应用程序上获取 GPS 坐标,但遇到问题。
我有这个代码:
public MapPage()
{
SearchPosition();
map = new Map
{
IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand
};
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(0.3)));
...
...
}
private async void SearchPosition()
{
position = await getPosition();
}
async Task<Plugin.Geolocator.Abstractions.Position> getPosition()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
Plugin.Geolocator.Abstractions.Position position = await locator.GetPositionAsync(TimeSpan.FromSeconds(5));
return position;
}
我想要的只是等待 GPS 坐标,但在我获得 GPS 坐标之前它会继续并转到“MoveToRegien”。我不明白为什么,有人可以帮助我吗?谢谢!
最佳答案
在 SearchPosition
方法中返回 void
而不是 Task
是否有任何特殊原因?
这可能是您的问题,因此将其更改为:
async Task SearchPosition()
我实际上会更改它以返回一个位置:
async Task<Plugin.Geolocator.Abstractions.Position> SearchPosition() => await GetPosition();
另一个问题是,您是否真的需要通过 SearchPosition()
方法包装 GetPosition()
方法,该方法除了调用第一个方法之外什么都不做?看起来很乱。
你的代码很难看,你没有遵循命名约定,你的代码一半看起来像 Java,另一半看起来像 C#。请在编写代码时尊重语言和自己,熟悉 naming conventions并关注他们。
编辑:
我想我现在看到了你真正的问题。您正在尝试在构造函数中获取位置,因此您不会等待异步 SearchPosition()
方法。
如果您的 MainPage
实际上源自 ContentPage
,我建议将您的 GPS 相关逻辑移至 OnAppearing
方法。这是一个例子:
public class MainPage : ContentPage
{
...
public MainPage()
{
map = new Map
{
IsShowingUser = true,
HeightRequest = 100,
WidthRequest = 960,
VerticalOptions = LayoutOptions.FillAndExpand
};
}
protected async override void OnAppearing()
{
position = await GetPosition();
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(0.3)));
}
async Task<Plugin.Geolocator.Abstractions.Position> GetPosition()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
Plugin.Geolocator.Abstractions.Position position = await locator.GetPositionAsync(TimeSpan.FromSeconds(5));
return position;
}
}
关于c# - 异步操作不会在await命令处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48111472/