![](/img/trans.png)
[英]URLConnection getContentLength() is returning a negative value
[英]getContentLength() returning -1 on some devices and not others
我正在尝试获取文件的大小,然后再下载它。 我使用conn.getContentLength();
为此,它可以在我的家用计算机Android 2.1 Emulator上正常运行。
但是,一旦我通过手机(WiFi或3G)运行我的应用程序,该功能将无法使用,而当我从工作笔记本电脑的Android 2.1仿真器中运行该应用程序时,该功能也将无法使用。
有谁知道解决方法? 还有另一种方法可以获取文件的大小,而无需使用HttpURLConnection
。
此信息并非始终可用。 通常,您会知道要下载的文件的长度。 根据Web服务器,协议,连接和下载方法的不同,此信息可能并不总是可用。
您绝对应该修改您的应用程序,以便它可以处理这种情况。 我认为您会发现使用不同连接方法的不同设备将为此提供不同的结果。
使用HttpVersion.HTTP_1_0
进行文件下载。 这样可以防止使用“分块传输编码”
请参阅: http : //en.wikipedia.org/wiki/Chunked_transfer_encoding
例如,重载构造函数,以便您可以指定哪个HTTP版本:
public class HTTPrequest
{
//member variables
private SchemeRegistry mSchemeRegistry;
private HttpParams mHttpParams;
private SingleClientConnManager mSCCmgr;
private HttpClient mHttpClient;
private HTTPrequestListener mHTTPrequestListener = null;
//constants
private final int TIMEOUT_CONNECTION = 20000;//20sec
private final int TIMEOUT_SOCKET = 30000;//30sec
//interface for callbacks
public interface HTTPrequestListener
{
public void downloadProgress(int iPercent);
}
/**
* Creates an HttpClient that uses plain text only.
* note: Default constructor uses HTTP 1.1
*/
public HTTPrequest()
{
this(HttpVersion.HTTP_1_1);
}
/**
* Creates an HttpClient that uses plain text only.
* @param httpVersion HTTP Version (0.9, 1.0, 1.1)
*/
public HTTPrequest(HttpVersion httpVersion)
{
//define permitted schemes
mSchemeRegistry = new SchemeRegistry();
mSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
//define http parameters
mHttpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(mHttpParams, TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(mHttpParams, TIMEOUT_SOCKET);
HttpProtocolParams.setVersion(mHttpParams, httpVersion);
HttpProtocolParams.setContentCharset(mHttpParams, HTTP.UTF_8);
//tie together the schemes and parameters
mSCCmgr = new SingleClientConnManager(mHttpParams, mSchemeRegistry);
//generate a new HttpClient using connection manager and parameters
mHttpClient = new DefaultHttpClient(mSCCmgr, mHttpParams);
}
public void setHTTPrequestListener(HTTPrequestListener httpRequestListener)
{
mHTTPrequestListener = httpRequestListener;
}
//other methods for POST and GET
}
当您要下载文件时,请使用HTTPrequest httpRequest = new HTTPrequest(HttpVersion.HTTP_1_0);
当您要进行POST或GET时,请使用HTTPrequest httpRequest = new HTTPrequest();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.