WP8应用程序使用传感器恢复

时间:2013-02-11 17:43:32

标签: windows-phone-8 sensor application-lifecycle

在我的WP8应用程序中,我使用所有传感器。 Accelerometer,Compass(来自Windows.Devices.Sensors和来自Microsoft.Devices.Sensors)和Inclinometer。 一切正常,直到我按 Windows 按钮,然后按后退按钮。 我得到了一个完整的黑屏,其中包含“Resuming ...”消息,没有任何反应。一旦我得到例外(仅从5岁开始):

{System.Runtime.InteropServices.SEHException: External component has thrown an exception.
   at Microsoft.Devices.Sensors.SensorBase`1.PauseSensor()
   at Microsoft.Devices.Sensors.SensorBase`1.<>c__DisplayClass7.<.ctor>b__4(Object sender, NotificationCallbackEventArgs args)
   at Microsoft.Devices.Sensors.SensorCallback.MS.Internal.Interop.INotificationCallback.Pausing(XPauseType pauseType)
   at MS.Internal.Interop.NotificationService.NotificationPausing(XPauseType pauseType)
   at MS.Internal.FrameworkCallbacks.NotificationPausing(UInt32 pauseType)}

有人见过这个例外吗?

或者在wp8应用程序生命周期中是否有最佳的传感器正常工作?

由于

2 个答案:

答案 0 :(得分:3)

这个问题比我想象的要复杂得多。我已经做了很多工作。我分享我发现的东西,因为我认为我的经历也可以帮助其他人。

我通过服务类使用传感器:这些类更新我的VM,在VM中我使用DispatcherHelper在UI上更新这些类。我知道是否要更新传感器的valuechanged事件中的UI绑定属性我需要在eventhandler中使用dispatcherhelper调用此更新,但我不知道的是,如果他们与VM而不是Views进行通信,他们的行为方式。当我启动应用程序时,如果传感器具有新值,我在更新UI时没有任何问题。我唯一的问题是在这种情况下,如果我想停用(按下Windows按钮)并激活(按下后退按钮)我的应用程序,我也没有例外,我没有丢失我的调试会话但只有一个黑色页面“恢复...“文本和正在运行的进度条,没有任何反应。

我错过的是一个crossthread / access异常。如果我使用UI绑定数据执行此操作,则会抛出异常但在这种情况下它不会。

另一件事:加速度计(我的版本只与加速度计配合使用)可以与仿真器配合使用,但在设备上却没有。我认为模拟器试图通过返回值来模拟加速器,但不是以正确的方式(没有线程问题)。

<强>解决方案

如果我在UI线程上的事件处理程序内更新(使用我自己的DispatcherHelper),一切正常。这是一个很好的经验教训,在与传感器和其他层/线程(VM,V)交互时要始终注意。

答案 1 :(得分:1)

听起来像生命周期问题。

您是否尝试在App.Deactivated事件上的Microsoft.Devices.Sensors上的传感器上调用SensorBase.Stop()并在App.Activated事件上使用SensorBase.Start()重新启动?根据您的应用中需要传感器访问的页数,您甚至可以覆盖OnNavigatedTo / OnNavigatedFrom方法并使用它们。

您不应该这样做,但根据您的应用程序,这可能是个好主意。 (您的应用是否支持锁定屏幕空闲执行?它是否具有后台代理?它是否尝试在后台运行时获取传感器读数?)