一段时间后,加速度计停止

时间:2014-12-11 22:29:14

标签: c# windows-runtime windows-phone-8.1 accelerometer win-universal-app

在我的应用程序中,我试图使用acceletometr并且它可以工作,但它会在一段时间后停止。我不知道为什么因为我跑它异步。

public void initAccelerometr()
{
    var _accelerometer = Accelerometer.GetDefault();
    if (_accelerometer != null)
    {
        // Establish the report interval
        _accelerometer.ReportInterval = 2;

        _accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(accelerometrReadingChanged);
    }
    else  {   /* not supported  */   }
}

async private void accelerometrReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
    var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        AccelerometerReading reading = e.Reading;
        AccelerometrZ = String.Format("{0,5:0.0000}", reading.AccelerationZ);
    });
}

有时当我移动手机时,它一直有效,但有时它只能工作几秒钟。

1 个答案:

答案 0 :(得分:2)

正如我测试的那样,你需要改变几件事:

  • 您不会使用最小值(可能)查询报告间隔。在我的手机上(Lumia 820)它是10毫秒 - 而且我认为它真的很低(2毫秒 - 呵呵 - 它不是手机,它是不错的测量设备;)。另外MSDN says

      

    应用程序应在设置报告间隔之前查阅MinimumReportInterval属性,以确保传感器可以遵循请求的报告间隔。将值设置为低于支持的最小间隔将触发异常或具有未定义的结果。

  • 第二件事 - 我认为您的_accelerometer可能是垃圾收集 - 您将其定义为局部变量,我已将其移至MainPage类:

      
    Accelerometer _accelerometer;
    public void initAccelerometr()
    {
        _accelerometer = Accelerometer.GetDefault();
        if (_accelerometer != null)
        {
            Debug.WriteLine("Minimum report interval is: {0}", _accelerometer.MinimumReportInterval);
            _accelerometer.ReportInterval = _accelerometer.MinimumReportInterval;
            _accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(accelerometrReadingChanged);
        }
    }
    

有了上述两件事,我的加速度计运行了10分钟,无法停止。我认为每10毫秒启动Dispatcher也不是一个好主意,我会在某处保存加速度计值并使用例如 DispatcherTimer 来显示它们:

  
DispatcherTimer dTimer;
public MainPage()
{
    this.InitializeComponent();
    this.Loaded += (sender, e) =>
        {
            initAccelerometr();
            dTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
            dTimer.Tick += (sa, ea) => myText.Text = acceletometerValue;
            dTimer.Start();
        };
}

string acceletometerValue;
private void accelerometrReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
    acceletometerValue = String.Format("{0,5:0.0000}", e.Reading.AccelerationZ);
}