我正在使用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。
帮助将不胜感激。感谢。
答案 0 :(得分:0)
请注意,位置服务可能会多次发送位置事件(here更多)。
即使位置服务未多次提供位置事件,API的使用和/或实施(Geolocator插件)也可能导致从API接收位置事件多次。
在应用程序中,您可以检查位置事件属性(准确性,位置时间戳,收到的事件顺序等)。如果时间戳和准确度相等,则使用“最佳”位置事件,其中“最佳”表示首选精度,最近时间戳或第一个接收到的位置事件。