我写了一个简单的下载管理器,我正在尝试为所有下载设置 RESUME。在谷歌搜索如何做到这一点之后。我知道必须 setRequestProperty
才能连接,但我的代码不起作用,我收到此错误:
FATAL EXCEPTION: Thread-882
java.lang.IllegalStateException: Cannot set request property after connection is made
at libcore.net.http.HttpURLConnectionImpl.setRequestProperty(HttpURLConnectionImpl.java:510)
我的代码是:
URL url = new URL(downloadPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
final int fileSize = connection.getContentLength();
File file = new File(filepath);
if (file.exists() && fileSize == file.length()) {
return;
} else if (file.exists()) {
connection.setRequestProperty("Range", "bytes="+(file.length())+"-");
}else
connection.setRequestProperty("Range", "bytes=" + downloadedSize + "-");
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
如何解决这个问题并正确设置setRequestProperty
为connection?
最佳答案
问题是您在调用 setRequestProperty()
之前调用了 connection.getContentLength()
。内容长度仅在您发出请求后可用,此时您无法设置请求属性...
目前还不完全清楚您要做什么,但一种选择是使用 HEAD
请求来获取内容长度,然后制作一个单独的如果您只需要获取一部分数据,请请求。当然,请注意内容长度可能会在请求之间发生变化。
但是,我实际上建议在下载管理器中的某处保留更多元数据 - 这样当您第一次开始下载数据时,您会记录总大小,这样您就不需要制作 恢复时的 HEAD
请求 - 你可以从本地信息中判断你是否已经下载了一个文件。 (这在内容变化方面有同样的问题,但那是另一回事。)
关于java - 当我尝试将 RequestProperty 设置为 HttpURLConnection 时,Android 出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838130/