1

我正在使用新的 Windows Phone 8 地图和地图工具包。在每个PositionChanged事件中,我将 设置UserLocationMarker为新位置。如果用户点击UserLocationMarker,我将通过显示地图位置ReverseGeocodeQuery并将用户位置图钉设置为可见。为了快速做到这一点,我ReverseGeocodeQueryPositionChanged事件中执行。

我的问题是,如果用户位置变化很快,它会执行很多ReverseGeocodeQuerys。这是性能问题吗?

private void InitializeGeolocator()
{
    geolocator = new Geolocator();
    geolocator.DesiredAccuracy = PositionAccuracy.High;
    geolocator.MovementThreshold = 5;
    geolocator.StatusChanged += geolocator_StatusChanged;
    geolocator.PositionChanged += geolocator_PositionChanged;
}

private void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    Dispatcher.BeginInvoke(() =>
    {
        Geoposition geoposition = args.Position;

        this.UserLocationMarker.GeoCoordinate = geoposition.Coordinate.ToGeoCoordinate();
        this.UserLocationMarker.Visibility = System.Windows.Visibility.Visible;

        // execute ReverseGeocodeQuery...
        // set Pushpin
    });
}

private void userLocationMarker_tap(object sender, GestureEventArgs e)
{
    // show user location pushpin...
    UserLocationPushpin.Visibility = Visibility.Visible;
}
4

1 回答 1

1

如果ReverseGeocodeQuery在事件内部调用PositionChanged,那么是的,这可能会导致性能问题。

作为一般规则,Windows Phone(和 Windows 8 / WinRT)中的任何异步调用通常意味着它可能不会在固定的时间内返回一个值——它可能需要 50 毫秒,也可能需要 5 秒。

使用ReverseGeocodeQuery,它向诺基亚的服务器 (geo.nlp.nokia.com) 发起网络调用以获取地址。尽管在使用 Wifi 或良好的 3G 连接时此呼叫会很快返回,但如果您接收不佳,则不会出现这种情况。

虽然我能理解您要做什么 - 提前查找地址,以便当用户点击 时UserLocationMarker,地址会立即出现 - 糟糕的网络质量可能会导致延迟或异常。

我的建议是遵循内置地图应用程序已经使用的方法。也就是说,当用户点击 时UserLocationMarker,它会显示一个“正在查找...”标签,然后进行异步地址查找,然后使用地址更新该标签。

另请记住,我们不知道 ReverseGeocodeQuery 是否受速率限制。它似乎没有,但将来可能会改变,因为大多数其他服务都是如此 -例如 Google 的 Geocoding API

无论您决定做什么,方便的测试工具都是...

  1. Fiddler以及如何在 WP8 模拟器中使用 Fiddler
  2. Windows Phone 的模拟仪表板(模拟糟糕的网络条件等)
于 2013-03-04T16:42:45.373 回答