IGeolocator的PositionChanged两次射击?

时间:2018-01-19 09:31:00

标签: c# events xamarin geolocation

上下文

我正在使用C#(Xamarin Forms)开发一个流量管理应用程序,需要持续提供用户的位置。

插件

我正在使用James Montemagno的Geolocator插件,并且IGeolocator接口上的PositionChanged事件似乎在发生位置更改时触发两次。

设备

我目前正在使用Visual Studio Enterprise v15.5.3上的Android模拟器进行调试

重现行为的步骤

1)实例化定位器对象后:

IGeolocator locator = CrossGeolocator.Current

2)触发定位器的PositionChanged时的一些代码:

locator.PositionChanged += (sender,e) => {
// Testing its frequency
System.Diagnostics.Debug.WriteLine("Position Changed Triggered.");
}

3)开始在异步Task函数中侦听

locator.DesiredAccuracy = 100;
if(!locator.isListening)
    await locator.StartListeningAsync(TimeSpan.FromMilliseconds(500), 1, true);

4)通过模拟器发送坐标

预期结果

输出窗口应显示一条消息“Position Changed Triggered”。

实际结果

输出窗口打印了两条相同的消息,说:“位置已更改已触发”。

为什么会这样?我怎样才能使事件只在每次实际改变位置时触发/处理ONCE。

到目前为止我尝试了什么

  • 用Google搜索问题,找不到相同的情况。
  • 看到一个解释here让我相信这是模拟器与它有关,虽然我发现解决方案有点含糊不清并且不确定他们所说的“实时/ Pin模式”
  • 创建了一个单独的函数并将事件分配给它,然后在调用我的代码后将其删除。这个执行会导致它执行一次,但除非我重新分配,否则它永远不会再执行。如果我这样做,那么代码肯定会第二次运行,导致同样的初始问题。
  • 尝试设置一个布尔值来检查它是否已经运行过一次,但在不合逻辑之后不久就实现了。
  • 尝试设置DateTime对象以确保在给定的时间范围内发生的事件不超过1个;这也不好。

帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

请注意,位置服务可能会多次发送位置事件(here更多)。

即使位置服务未多次提供位置事件,API的使用和/或实施(Geolocator插件)也可能导致从API接收位置事件多次。

在应用程序中,您可以检查位置事件属性(准确性,位置时间戳,收到的事件顺序等)。如果时间戳和准确度相等,则使用“最佳”位置事件,其中“最佳”表示首选精度,最近时间戳或第一个接收到的位置事件。