【发布时间】:2014-06-16 12:57:04
【问题描述】:
我有一个 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 lopp。或者如果有更好的方法来获取数据。
任何帮助将不胜感激。
【问题讨论】: