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

Timer dart:在给定时间后停止收听流,timer,stream,dart,icecast,Timer,Stream,Dart,Icecast,我有一个Dart服务器,它从icecast流获取元数据 要获取元数据,我有以下方法: void getMetaData(){ HttpClient=新的HttpClient(); getUrl(Uri.parse(this.src)) .然后((HttpClientRequest请求){ request.headers.add(HttpHeaders.USER_代理,“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chr

我有一个Dart服务器,它从icecast流获取元数据

要获取元数据,我有以下方法:

void getMetaData(){
HttpClient=新的HttpClient();
getUrl(Uri.parse(this.src))
.然后((HttpClientRequest请求){
request.headers.add(HttpHeaders.USER_代理,“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/27.0.1453.110 Safari/537.36”);
添加(“Icy元数据”、“1”);
返回请求。close();
})
.然后((HttpClientResponse响应){
if(response.headers.value(“icy metaint”)!=null){
this.offset=int.parse(response.headers.value(“icy metaint”);
//打印(response.headers.toString());
bool-stop=false;
列表元数据=新列表();
streamListener=response.listen(null);
streamListener.onData((数据){
当(!停止){
如果(data.length>17000){stop=true;}
}
元数据=data.getRange(偏移量,偏移量+数据[offset]*16);
String metaDataString=新字符串.fromCharCodes(元数据);
打印(元数据字符串);
streamListener.cancel();
});
streamListener.onError((e){
印刷品(e);
});
}
});
}
该方法按预期工作,直到流不返回任何数据或需要很长时间才能返回。然后它就停止工作了。我假设该方法不会退出while循环

这就是为什么我可能需要另一个条件来打破while循环。我认为定时器会很好,但我不知道如何实现定时器在5秒左右后中断while-lopp。或者如果有更好的方法获取数据

任何帮助都将不胜感激。

DateTime endTime=new DateTime.now().add(新的持续时间(毫秒:5000));
当(!停止){
如果(data.length>17000 | | new DateTime.now().compareTo(endTime)>0){
停止=真;
}
}

但是你最好找到一种方法来完成这项工作,而不必使用这个繁忙的循环

嘿,甘特,谢谢你所有的dart答案,但这一个不起作用。我已经用while(!isTimedOut)试过了,你的代码就在while循环前面。由于无休止的while循环,未来的回调永远不会执行。无止境的循环似乎阻止了其他一切,即使是asnyc函数。