Android:HTTP-Request经常失败并且速度很慢

时间:2012-05-17 15:21:47

标签: android http url timeout wlan

我正在使用以下愚蠢的代码来下载一些数据:

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(url));
request.setHeader("User-Agent","Android Browser");
HttpResponse response = client.execute(request);
in=response.getEntity().getContent();
len=(int)response.getEntity().getContentLength();
if (len<=0) return null;
data=new byte[len];
...

以这种方式下载数据非常慢,并且经常因连接超时而失败。其他用户设备也是如此,因此我的网络配置不应该是原因。

另一方面,当我将其输入普通浏览器时,给定的“url”工作正常,它很快并且几乎立即返回结果。我的Android设备和带有该浏览器的“普通”计算机在同一个WLAN网络上运行。那么这里可能出现什么问题?

2 个答案:

答案 0 :(得分:0)

对我而言,在模拟器中运行应用程序(慢)和在手机中运行应用程序(快速)之间存在巨大差异。超时可能是因为网络服务器在一段时间后关闭了连接。但也可以尝试使用缓冲读卡器。

    private static JSONArray getJSON(String url) {
    // initialize
    InputStream is = null;
    JSONArray res = null;

    // http post
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        res = new JSONArray(sb.toString());
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    return res;
}

答案 1 :(得分:0)

你最有可能在引用代码之外做一些有趣的事情,请你运行这个函数并在日志中查看完成请求需要多长时间?

function check_fetch_time(String url) {
    long start = System.currentTimeMillis();

    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response = client.execute(request);
    try {
        flushContent( response.getEntity().getContent() );
    } catch (Exception e) {}

    long elapsed = System.currentTimeMillis() - start;
    Log.v(TAG, "page fetched in " + elapsed + "ms");
}

  

20秒。是的,真的是秒,而不是毫秒。

嗯,肯定不是这里的事。您可以打开手机上的浏览器并尝试访问网络吗?如果浏览器访问速度同样慢,这对您的软件来说不是问题,也许您的邻居正在微缩他们的香肠并扰乱您的无线网络。但是,如果浏览器几乎立即(在一两秒内)打开页面,那么您的程序就会很有趣。在这种情况下,我将创建空的HelloWorld项目,在那里复制check_fetch_time()并再试一次。