2010-09-01 97 views
1

我试图在下载文件之前获取文件的大小。我使用conn.getContentLength();来做到这一点,它可以在我的家用电脑Android 2.1 Emulator上正常工作。getContentLength()在某些设备上返回-1而不是其他设备

它然而,一旦我从我的手机(Wi-Fi或3G)上运行我的应用程序不工作,也当我从我的工作运行这是行不通的笔记本电脑的Android 2.1模拟器。

有没有人知道这个解决方法?有没有另外一种方法可以获得文件的大小,可能不需要使用HttpURLConnection

+1

可能是这样的:http://stackoverflow.com/questions/3418106/getcontentlength-return-1-only-in-wifi有与它有关的事情? – fredley 2010-09-01 11:31:03

+0

@fredley我看到那篇文章,但我希望有人可能会用一个不同的类来检索它。 – mlevit 2010-09-01 12:06:05

回答

1

这些信息并不总是可用的。通常你会知道你正在下载的文件的长度。根据网络服务器,协议,连接和下载方法的不同,这些信息可能并不总是可用的。

你一定要修改你的应用程序,以便它可以处理这种情况。我想你会发现使用不同连接方法的不同设备将提供不同的结果。

+0

我检查文件大小,如果返回-1我用不同的功能迎合它,但我不能再显示水平进度栏只有微调器...因此,我想显示一个水平条,所以用户有一个明确的时间等等谢谢 – mlevit 2010-09-01 12:05:23

+0

当然。这完全可以理解。 – 2010-09-01 12:18:19

0

使用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();