timer - dart:在给定时间后停止收听流

标签 timer stream dart icecast

我有一台Dart服务器,该服务器从Icecast流中获取元数据。

要获取元数据,我可以使用以下方法:

void getMetaData() {

    HttpClient client = new HttpClient();
    client.getUrl(Uri.parse(this.src))
    .then((HttpClientRequest request) {
        request.headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36");
        request.headers.add("Icy-MetaData", "1");
        return request.close();
    })
    .then((HttpClientResponse response) {
        if(response.headers.value("icy-metaint") != null) {
            this.offset = int.parse(response.headers.value("icy-metaint"));
            //print(response.headers.toString());
            bool stop = false;
            List<int> metaData = new List();
            streamListener = response.listen(null);
            streamListener.onData((data) {
                while(!stop) {
                    if(data.length > 17000) { stop = true; }
                }
                metaData = data.getRange(offset, offset + data[offset]*16);
                String metaDataString = new String.fromCharCodes(metaData);
                print(metaDataString);
                streamListener.cancel();
            });
            streamListener.onError((e) {
                print(e);
            });
        }
    });
}

该方法将按预期工作,直到流不返回任何数据或需要很长时间才能返回它。然后它就停止工作了。我认为该方法不会退出while循环。

那就是为什么我可能需要另一个条件来打破while循环。我以为计时器会很好,但是我不知道如何实现计时器以在5秒钟左右的时间内打破while停顿。或者,如果有更好的方法来获取数据。

任何帮助,将不胜感激。

最佳答案

DateTime endTime = new DateTime.now().add(new Duration(milliseconds: 5000));

while(!stop) {
  if(data.length > 17000 || new DateTime.now().compareTo(endTime) > 0) {
    stop = true;
  }
}

但您最好找到一种方法来完全避免这种繁忙的循环

关于timer - dart:在给定时间后停止收听流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244299/

相关文章:

java - 带计时器的 ServletContextListener 未在控制台中显示输出

java - 当所有线程完成处理时运行代码

stream - 如何捕获网络摄像机 (mjpeg) 流并稍后通过命令行重播?

flutter - 如何访问 Flutter for desktop (macOS) 应用程序中的方法

flutter - 抖动重建导致数据更改

c# - 定时器与 While 循环——内存使用

c++ - 如何同时使用boost auto_cpu_timer和progress_display?

java - 具有合成时间戳的 Spark 窗口函数?

java - readInt() 在 Android 中如何工作?

dart - 是否可以通过单独构建Polymer.dart元素?