【问题标题】:How to drop unprocessed events because of slow processing device while listening on a StreamSubscription?如何在侦听 StreamSubscription 时由于处理设备速度慢而丢弃未处理的事件?
【发布时间】:2020-11-14 07:43:03
【问题描述】:

我有一个 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]}'),
}

我不清楚如何以只丢失“堆积”的碎片的方式从流中丢弃碎片,并且仅在设备“蹩脚”的情况下。

【问题讨论】:

    标签: flutter dart stream bluetooth-lowenergy


    【解决方案1】:

    我目前的解决方案是使用RxDart 限制流的速率。 _primaryMeasurements.valueStream<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))

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多