我将Nexus 5更新为Lollipop,现在我的Android应用程序遇到了这个错误:
我的应用程序从我的网站 API 获取它的内容。为此,该应用程序联系API"同步",该API"响应新的或更新的项目列表。应用读取此列表,循环遍历不同的项目,并在 AsyncTask 中启动httppost
,以从 API 加载每个项目的内容。为了能够取消更新过程,我只在上一个完成后开始下一个httppost
。
较低的Android版本上没有问题,但是当我开始更新时,使用棒棒糖时,前4个项目正常加载(并且快速:50ms(,但是第五个项目在以下代码response = httpClient.execute(httppost);
期间卡住了:
HttpPost httppost;
try {
httppost = new HttpPost(url);
} catch (IllegalArgumentException e) {
Log.e(Globals.TAG_API, "Wrong URL");
throw e;
}
HttpResponse response;
HttpParams httpParams = new BasicHttpParams();
httpParams.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpConnectionParams.setTcpNoDelay(httpParams, false);
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);
HttpClient httpClient = new DefaultHttpClient(httpParams);
HttpEntity entity;
try {
Log.d(Globals.TAG,"Start");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
response = httpClient.execute(httppost);
Log.d(Globals.TAG,"Stop");
entity = response.getEntity();
}
30 秒后,超时将取消连接。同样重要的是:在这30秒内,整个主页都无法访问。我不认为错误出在 API 中,因为使用旧版 Android 的设备使用相同的 API......
请评论,如果您需要来自 API 或 APP 的更多代码,我只希望错误在上面的代码中:)
更新 21.12.2014在评论中进行了一些讨论后,我们发现,AsyncTask(其中httppost
(中的sleep(300)
解决了这个问题。所以问题是,太多的httppost到达服务器并阻止了我的ip,sleep
这是减少;-(
更新 1.1.2015我没有发现问题是基于服务器还是在我的应用程序中。但是现在我使用GoogleVolley作为我的API,它工作得很好!
阅读AsyncTask'threadpoolexecutor'上的文档
尝试确定平台 API 升级是否以某种方式改变了池的默认策略以及 asyncTask 使用的线程数和执行器?
如果您想要控制自己的客户端池化 http 执行器的替代方法,请查看此处的示例,例如使用 android 处理程序运行您自己的异步 http 队列框架。