我正在进行各种下载服务,它能够恢复以前的部分下载。我目前正在使用像这样的跳过方法
long skipped = 0;
while (skipped < track.getCacheFile().length()){
skipped += is.skip(track.getCacheFile().length()-skipped);
}
我刚做了一个测试,在输入流中跳过45 mb大约需要57秒。我很好奇某些本机代码如何做到这一点,例如,媒体播放器可以即时搜索远程流的任何部分。我意识到我无法访问相同的库,但我可以实现类似的东西。
不过,那个测试是在wifi上进行的。在正常的数据网络上,这显然要慢得多。更新:非常简单(感谢下面)
if (track.getCacheFile().length() > 0){
request.setHeader("Range","bytes="+track.getCacheFile().length()+"-");
}
答案 0 :(得分:2)
skip方法的问题在于,即使您跳过它们也必须读取数据,因此需要接收它们。最好的解决方案可能是只向服务器请求您想要的部分。
答案 1 :(得分:2)
答案 2 :(得分:0)
你可以这样做:
private InputStream getRemote(String url, long offset) {
try {
URLConnection cn = new URL( url ).openConnection();
cn.setRequestProperty ("Range", "bytes="+offset+"-");
cn.connect();
length = cn.getContentLength();
return cn.getInputStream();
} catch (MalformedURLException e ) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace(); }
return null;
}
然后,当您需要跳过时,实际上是通过HTTP重新连接到新的偏移量。工作快速可靠,比使用输入流的跳过要好得多。