在侦听 StreamSubscription 时,如何因设备处理速度慢而丢弃未处理的事件?

How to drop unprocessed events because of slow processing device while listening on a StreamSubscription?

我有一个 Flutter 应用程序,它使用 flutter_blue 包从低功耗蓝牙设备接收数据流。我用一台旧平板电脑测试了我的应用程序,其中一个源设备每秒 3-4 次将数据提取到流中。显然,低迷的平板电脑跟不上需求。因此,当信息流停止时,我的应用程序仍然显示不断变化的数据,因为它经过流中的每个事件,直到它到达终点。

我想要删除设备无法跟上的任何事件。对于我的应用程序,如果某些帧被丢弃,这不是问题。用网络隐喻来说:UDP 连接对我来说已经足够了,我不需要 TCP。

// Widget field:
BluetoothCharacteristic _primaryMeasurements;

// later:
await _primaryMeasurements.setNotifyValue(true);
_primaryMeasurements.value.listen((data) async {
  if (data != null && data.length > 1) {
    await _recordMeasurement(data);
  }
});

// Even later, this is obviously over simplified essence
@override
Widget build(BuildContext context) {
  return Text('${data[3]}'),
}

我不清楚如何以只丢失“堆积”的方式从流中删除部分,并且仅在设备“lame”的情况下。

我目前的解决方案是使用 RxDart 对流进行速率限制。 _primaryMeasurements.value 是一个 Stream<List<int>>。有人可以这样说:

import 'package:rxdart/rxdart.dart';

// Widget field:
BluetoothCharacteristic _primaryMeasurements;

// later:
await _primaryMeasurements.setNotifyValue(true);
_primaryMeasurements.value.throttleTime(Duration(milliseconds: 500)).listen((data) async {
  if (data != null && data.length > 1) {
    await _recordMeasurement(data);
  }
});

这将确保每秒最多处理两个数据点。关键部分是 .throttleTime(Duration(milliseconds: 500)).

这种节流设置了一个固定的速率,所以如果一个设备非常强大,它仍然只能通过节流限制的速度接收数据。但至少这会松一口气并帮助减少电池消耗,如果限制设置得当,较慢的设备也可以处理数据。