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
相关产品推荐
相关产品推荐

