我正在使用以下愚蠢的代码来下载一些数据:
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网络上运行。那么这里可能出现什么问题?
答案 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()
并再试一次。