You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Timer获取传感器数据异常问题求助

问题排查与解决方案

嘿,我一眼就发现你代码里的核心问题了——每次Timer回调都在重复创建传感器事件的监听,这直接导致了数据疯涨和提前触发排序的问题!

问题详细分析

你的Timer.periodic会每秒执行一次回调,而每次回调里都调用accelerometerEvents.listen(...):

  • 第一次Timer触发:新增1个传感器监听,开始往列表加数据
  • 第二次Timer触发:又新增1个传感器监听,现在有2个监听同时往列表加数据
  • 第三次Timer触发:再新增1个,变成3个监听...
    这样一来,传感器事件会被多个监听同时接收,数据增长速度是每秒N条(N是当前监听的数量),所以短短3秒左右列表长度就超过10,而且数据量会远多于预期的10条。

另外,你的排序条件if(accList.length > 10)也有逻辑漏洞:只要长度超过10就会触发排序,但Timer还在继续跑,还在不断新增监听,数据会越来越多。

修正后的代码示例

我们需要调整逻辑:只创建一次传感器监听,然后用Timer来控制采集的时长(比如10秒),或者计数到10条就停止采集并排序。这里给你两种实现方式:

方式一:按时长采集10秒后排序

List<SensorAccelerometer> accList;
StreamSubscription<AccelerometerEvent> _sensorSubscription;
Timer _timer;

void startRecording() {
  accList = [];
  // 只创建一次传感器监听
  _sensorSubscription = accelerometerEvents.listen((AccelerometerEvent event) {
    SensorAccelerometer sensorAccelerometer = SensorAccelerometer(event.x, event.y, event.z);
    accList.add(sensorAccelerometer);
  });

  // 10秒后停止采集并排序
  _timer = Timer(Duration(seconds: 10), () {
    // 先取消监听和Timer,避免内存泄漏
    _sensorSubscription.cancel();
    _timer.cancel();
    // 对列表排序
    accList.sort();
    // 这里可以处理排序后的逻辑,比如打印或展示数据
    print("采集完成,共${accList.length}条数据");
  });
}

方式二:采集满10条数据后排序

List<SensorAccelerometer> accList;
StreamSubscription<AccelerometerEvent> _sensorSubscription;

void startRecording() {
  accList = [];
  _sensorSubscription = accelerometerEvents.listen((AccelerometerEvent event) {
    SensorAccelerometer sensorAccelerometer = SensorAccelerometer(event.x, event.y, event.z);
    accList.add(sensorAccelerometer);
    
    // 当数据满10条时,停止监听并排序
    if (accList.length == 10) {
      _sensorSubscription.cancel();
      accList.sort();
      print("采集完成,共10条数据");
    }
  });
}

额外注意事项

  • 记得在不再需要的时候取消StreamSubscription和Timer,避免内存泄漏
  • 如果你的SensorAccelerometer的sort()方法是自定义的,要确保它正确实现了比较逻辑(比如重写compareTo方法)

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:54