CrossGeolocator GetPositionAsync 退出循环/方法

Posted

技术标签:

【中文标题】CrossGeolocator GetPositionAsync 退出循环/方法【英文标题】:CrossGeolocator GetPositionAsync exits loop/method 【发布时间】:2019-01-12 19:19:51 【问题描述】:

我想经常在应用程序中保留手机的位置,所以我使用 GetPositionAsync 方法,并继续调用它。我已经编写了一些代码,当我将其附加到一个简单的 OnAppearing 方法中时,一切正常。如果我在方法或 while 循环中编写它,当它到达 GetPositionAsync 或其他一些本地数据库的东西时,我认为只有可等待的方法,它会直接跳出循环/方法。我正在使用异步。有什么想法吗?

var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 20;

var position = await locator.GetPositionAsync(TimeSpan.FromSeconds(10));

location.Latitude = position.Latitude;
location.Longitude = position.Longitude;

await App.LocationDatabase.SaveLocationAsync(location);
await Task.Delay(TimeSpan.FromSeconds(10));

【问题讨论】:

你的问题不清楚请清楚 【参考方案1】:

您没有共享任何循环代码,因此很难重现您的问题。

无论如何,您不应该在循环中调用GetPositionAsync,而是使用StartListeningAsync 方法并连接到PositionChange 事件。

async Task StartListeningAsync()

    if(CrossGeolocator.Current.IsListening)
        return;

    await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true);

    CrossGeolocator.Current.PositionChanged += PositionChanged;
    CrossGeolocator.Current.PositionError += PositionError;


private void PositionChanged(object sender, PositionEventArgs e)

    //If updating the UI, ensure you invoke on main thread
    var position = e.Position;
    var output = "Full: Lat: " + position.Latitude + " Long: " + position.Longitude;
    output += "\n" + $"Time: position.Timestamp";
    output += "\n" + $"Heading: position.Heading";
    output += "\n" + $"Speed: position.Speed";
    output += "\n" + $"Accuracy: position.Accuracy";
    output += "\n" + $"Altitude: position.Altitude";
    output += "\n" + $"Altitude Accuracy: position.AltitudeAccuracy";
    Debug.WriteLine(output);
 

private void PositionError(object sender, PositionErrorEventArgs e)

    Debug.WriteLine(e.Error);
    //Handle event here for errors
 

async Task StopListeningAsync()

    if(!CrossGeolocator.Current.IsListening)
        return;

    await CrossGeolocator.Current.StopListeningAsync();

    CrossGeolocator.Current.PositionChanged -= PositionChanged;
    CrossGeolocator.Current.PositionError -= PositionError;

https://jamesmontemagno.github.io/GeolocatorPlugin/LocationChanges.html

【讨论】:

以上是关于CrossGeolocator GetPositionAsync 退出循环/方法的主要内容,如果未能解决你的问题,请参考以下文章

CrossGeolocator GetPositionAsync 退出循环/方法

Xamarin-靠近位置

Xamarin 表单获取当前位置需要更多时间

xamarin 形式的地理定位器