6

我在 Geolocator 对象中设置了一个 PositionChanged 侦听器

var geolocator = new Geolocator();
geolocator.PositionChanged += Geolocator_PositionChanged;

它可以正常工作一段时间。但是经过一段时间没有用户交互(+- 4 小时)后,它会停止接收位置更改,我认为是因为 WP8 简单地杀死了它。这可能是 ms 所希望的,但这对我的应用程序模型来说太可怕了。

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

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

我已经尝试在 PositionChanged 委托中实例化一个新的 Geolocator,但这不起作用。

很感谢任何形式的帮助。谢谢!

4

3 回答 3

2

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

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

并在状态为Windows.Devices.Geolocation.PositionStatus.disabled或时重新启动对象Windows.Devices.Geolocation.PositionStatus.notAvailable

请参阅Geolocator.StatusChanged | statuschanged 事件以获取更多详细信息。

希望我有所帮助

于 2013-04-30T08:05:12.873 回答
1

您是否在通话中指定超时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;

    });

}
于 2013-05-06T00:57:01.297 回答
1

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

您正在使用的大多数硬件资源都有调用的方法

addEventListener

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

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

于 2013-05-06T05:56:53.140 回答