一些快速背景。我们有多个设备运行扫描程序应用程序,它会检查数据库以查看是否已扫描了ID。我可以随意扫描设备A,没有问题。然后我拿起设备B并扫描,也是我喜欢的次数。如果我选择设备A备份并扫描,HttpClient将挂起大约60秒,拒绝发送任何进一步的请求。下面的代码评论了失败的地方。
// Asynchronous get request
private class aGETRequest extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
client.setKeepAliveStrategy(null);
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse httpResponse = client.execute(httpGet); //Hangs Here
HttpEntity httpEntity = httpResponse.getEntity();
InputStreamReader isr = new InputStreamReader(httpEntity.getContent());
BufferedReader buffer = new BufferedReader(isr);
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
httpEntity.consumeContent();
isr.close();
} catch (Exception e) {
e.printStackTrace();
}
httpGet.abort();
client.getConnectionManager().shutdown();
}
return response;
}
@Override
protected void onPostExecute(String result) {
results(result);
}
}
客户端挂起甚至窥探流量显示故障后设备A根本没有发送任何请求。你准备好了最好的部分吗?如果设备通过代理服务器,它可以工作。 W.T.F?
答案 0 :(得分:0)
Android是java 6 compat。右。
java 7上的BufferedReader让我感到紧张,而while read循环似乎是什么悬挂......
我会尝试一个不同的不同的读取循环类,它在java 6上是可靠的,或者我会找到其他人的httpclient模式,它是可靠的。
我的猜测是,你的代码永远不会脱离以下内容......
while ((s = buffer.readLine()) != null)
也许服务器正在使用diff协议(长度= 0的模式,然后是\ r \ n或something来重新启动分块编码。