下载字符串时超时

时间:2011-07-26 23:56:06

标签: android http download timeout

我使用以下两个函数从服务器下载字符串。我还记录下载文本所需的时间,既可以是客户端看到的,也可以是服务器看到的。下载的字符串永远不会相同。

服务器时间仅为几毫秒,但客户端看到的时间平均为100毫秒,具体取决于wifi信号。有时,即使服务器时间仍在可接受的限制范围内,客户端时间也会达到3000毫秒(但绝不会高于3200毫秒)。

我开始认为超时已定义,但我不知道它可能在哪里。它不在我的代码中,我在开发者网站上浏览过并没有结果谷歌。

我希望有人可以给我一些可以定义此延迟的线索,并确认默认情况下它是3000毫秒。

private String DownloadText(String URL)
{
    String str = "";
    int BUFFER_SIZE = 2000;
    InputStream in = null;
    try{
        in = OpenHttpConnection(URL);
    } catch (IOException e1) {
        e1.printStackTrace();
        return "";
    }
    catch(ArithmeticException ae){
        //
    }
    try{
        InputStreamReader isr = new InputStreamReader(in);
        int charRead;

          char[] inputBuffer = new char[BUFFER_SIZE];          
        try {
            while ((charRead = isr.read(inputBuffer))>0)
            {                    
                //---convert the chars to a String---
                String readString = 
                    String.copyValueOf(inputBuffer, 0, charRead);                    
                str += readString;
                inputBuffer = new char[BUFFER_SIZE];
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return str;        
}

private InputStream OpenHttpConnection(String urlString) throws IOException {
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString); 
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection");

    try{
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect(); 

        response = httpConn.getResponseCode();                 
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();                                 
        }
    }
    catch (Exception ex) {
        throw new IOException("Error connecting");            
    }
    return in;     
}
BTW:我从google的搜索结果中借用了这两个函数。

编辑:我从一个线程中调用DownloadText(url)。我开始认为这可能与超时有关。是吗?

2 个答案:

答案 0 :(得分:1)

这将对您有所帮助:

  private static final int CONNECT_TIMEOUT_MILL = 10000;
  private static final int READ_TIMEOUT_MILL = 3000;
  ....
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setConnectTimeout(CONNECT_TIMEOUT_MILL);
  con.setReadTimeout(READ_TIMEOUT_MILL);
  ....

答案 1 :(得分:0)

之前我见过类似的行为。就我而言,它是在AJAX调用中,对我来说它也是一个真正的头脑益智游戏。在我的情况下,结果是服务器在没有

的情况下返回数据
  1. 指定内容长度或
  2. 关闭http连接
  3. 因此浏览器必须等待连接超时才能处理数据并生成接收事件。在你的情况下可能会发生类似的事情,所以打破网络分析软件并验证http正确性。我通常使用Fiddler2进行此类工作,但我不知道你是否可以让android设备很好地通过代理。听起来你控制着Web服务器,所以也许可以从那一端检查tcp数据包。