1

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

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 网络上运行。那么这里有什么问题呢?

4

2 回答 2

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;
}
于 2012-05-17T15:26:18.443 回答
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 秒。是的,真的是几秒钟,而不是几毫秒。

好吧,这里肯定有什么不妥。能否请您打开手机上的浏览器并尝试访问网络?如果浏览器访问速度同样慢,这不是您的软件的问题,也许您的邻居正在用微波炉加热他们的香肠并破坏您的 wifi。但是,如果浏览器几乎是立即打开页面(在一两秒内),那么您的程序有些有趣。在这种情况下,我会创建空的 HelloWorld 项目,复制check_fetch_time()到那里再试一次。

于 2012-05-17T15:53:17.493 回答