java - 当我尝试将 RequestProperty 设置为 HttpURLConnection 时,Android 出现错误

标签 java android

我写了一个简单的下载管理器,我正在尝试为所有下载设置 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/

相关文章:

android - 使用 gradle 插件 0.*.* 在 Android Studio 1.0+ 中打开项目

java - java中的绑定(bind)器方法

java - 将对象列表转换为 Java 中的可选对象列表

java - Apache PDFBox 2.0 - 创建的 PDF 文件中未显示文本

java - 两地之间的物理距离

java - 在后台线程上创建一个 RealmQuery

android - ART 在 native 信号处理期间阻止来自 JNI 的任何 Java 调用

java - 如何更改 Android list 以启动应用程序而不是 Activity ?

java - 可以使用线性搜索来查找循环(​​循环)数组中的最小数字

java - 枚举的大小 <String>