Windows Phone 8 -地理定位器位置改变的监听器在一段时间后死亡

本文关键字:监听器 一段时间 改变 Phone -地 位置 定位器 Windows | 更新日期: 2023-09-27 18:11:14

我正在使用

在地理定位器对象中设置PositionChanged侦听器
var geolocator = new Geolocator();
geolocator.PositionChanged += Geolocator_PositionChanged;

它可以正常工作一段时间。但在没有用户交互的一段时间后(+- 4小时),它停止接收位置变化,我想是因为WP8直接杀死了它。这可能是ms想要的,但这对我的应用程序模型来说是可怕的。

我所做的是另外设置一个PeriodicTask并发送位置。这个运行起来没有问题,但是如果用户改变了他的位置,我就无法真正跟踪它了。

问题是:有没有办法在不需要用户交互的情况下唤醒这个地理定位器?它可以通过PeriodicTask甚至在PositionChanged中设置。

我已经尝试实例化一个新的地理定位器已经在PositionChanged委托,但这不起作用

任何帮助都是非常感激的。谢谢你!

Windows Phone 8 -地理定位器位置改变的监听器在一段时间后死亡

似乎是某种GC杀死/禁用了实例。

尝试使用geolocator.addEventListener("statuschanged", onStatusChanged);

,当状态为Windows.Devices.Geolocation.PositionStatus.disabledWindows.Devices.Geolocation.PositionStatus.notAvailable时重启对象。

看到Geolocator。StatusChanged | StatusChanged事件查看详细信息。

希望我有所帮助

您是否在GetGeopositionAsync调用中指定超时?根据这篇文章底部的最后一条评论,这段代码修复了GetGeopositionAsync调用没有返回的问题。这可能是相关的。

public Task GetCurrentPosition()
{
    return Task.Run(() =>
    {
        if (_geolocator == null)
        {
           _geolocator = new Geolocator { DesiredAccuracy = PositionAccuracy.High };
        }
        Geoposition geoposition = null;
        ManualResetEvent syncEvent = new ManualResetEvent(initialState: false);
        IAsyncOperation asyncOp = _geolocator.GetGeopositionAsync();
        asyncOp.Completed += (asyncInfo, asyncStatus) =>
        {
           if (asyncStatus == AsyncStatus.Completed)
           {
               geoposition = asyncInfo.GetResults();
           }
           syncEvent.Set();
        };
        syncEvent.WaitOne();
        return geoposition.Coordinate;
    });
}

可能垃圾回收器发现它未使用并杀死或至少禁用它以省电。

您正在使用的大多数硬件资源都有一个名为

的方法
addEventListener

这是通知资源的一种方式:"嘿!我想从你那里得到更新,所以不要死。"这是一种非常常见的观察对象并异步获取更新的模式。

看看http://en.wikipedia.org/wiki/Observer_pattern