4

WP8のアプリケーションでは、すべてのセンサーを使用しています。加速度計、コンパス(Windows.Devices.SensorsおよびMicrosoft.Devices.Sensorsからも)および傾斜計。Windowsボタンを押してから戻るボタンを押すまで、すべて正常に動作します。「再開しています...」というメッセージが表示された完全な黒い画面が表示されますが、何も起こりません。例外が発生したら(5つの障害から1回だけ):

{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アプリケーションのライフサイクル中にセンサーを正しく操作するためのベストプラクティスはありますか?

ありがとう

4

2 に答える 2

3

この問題は私が思っていたよりも複雑でした。私はこれでたくさん働きました。私はそれを使った私の経験が後で他の誰かにも役立つと思うので、私が見つけたものを共有します。

私はサービスクラスを通じてセンサーを操作しました。これらのクラスはVMを更新し、VMではDispatcherHelperを使用してUIでこれらを更新します。センサーの値が変更されたイベントのUIバインドされたプロパティを更新するかどうかはわかっていましたが、dispatcherhelperを使用してeventhandlerでこの更新を呼び出す必要がありますが、ビューではなくVMと通信している場合の動作がわかりませんでした。アプリを起動したとき、センサーに新しい値があった場合でもUIの更新に問題はありませんでした。私の唯一の問題は、この場合、アプリを非アクティブ化(Windowsボタンを押す)してアクティブ化(戻るボタンを押す)したい場合、例外はなく、デバッグセッションを失うことはなく、「再開」のある黒いページしか表示されないことでした。 …」テキストと実行中のプログレスバーで何も起こりませんでした。

私が見逃したのは、クロススレッド/アクセスの例外でした。UIにバインドされたデータを使用してこれを行うと、例外がスローされますが、この場合はスローされませんでした。

もう1つ:加速度計(私は加速度計でのみ動作するバージョンを持っていました)はエミュレーターで動作しますが、デバイスでは動作しません。エミュレーターは値を返すことによってアクセラレーターをシミュレートしようとしますが、正しい方法ではないと思います(スレッドの問題なし)。

解決

UIスレッドのイベントハンドラー内で(自分のDispatcherHelperを使用して)更新すると、すべてが正常に機能します。これは良い教訓であり、センサーや他のレイヤー/スレッド(VM、V)と対話するときは常に注意を払ってください。

于 2013-02-15T06:28:44.100 に答える
1

ライフサイクルの問題のように聞こえます。

App.DeactivateイベントでMicrosoft.Devices.Sensorsからセンサーに対してSensorBase.Stop()を呼び出し、App.ActivatedイベントでSensorBase.Start()を使用して再開してみましたか?アプリ内でセンサーアクセスが必要なページの数によっては、OnNavigatedTo/OnNavigatedFromメソッドをオーバーライドしてそれらを使用できる場合もあります。

あなたはそれをする必要はないはずです、しかしあなたのアプリによってはそれは良い考えかもしれません。(アプリはロック画面のアイドル実行をサポートしていますか?バックグラウンドエージェントがありますか?バックグラウンドで実行しているときにセンサーの読み取り値を取得しようとしますか?)

于 2013-02-12T00:51:13.157 に答える