Android应用:为什么它会在多个http帖子上超时

时间:2014-12-18 08:49:37

标签: android api timeout http-post

我将Nexus 5更新为Lollipop,现在我的Android应用程序出现了这个错误:

我的应用程序从我的网站api获取它的内容。为此,应用程序会联系API“同步”,它会响应新的或更新的项目列表。应用程序读取此List,循环遍历不同的Items并在AsyncTask中启动httppost以从API为每个Item加载内容。 为了能够取消更新过程,我只在前一个完成时开始下一个httppost

在较低的Android版本上没有问题,但是当我开始更新时使用Lollipop正常加载前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中的更多代码,我只希望该错误在上面的代码中:)

更新2014年12月21日 在评论中进行了一些讨论之后,我们发现,AsyncTask中的sleep(300)(其中httppost)解决了这个问题。所以问题是,太多的httppost到达服务器并阻止我的ip,sleep这会减少; - )

更新1.1.2015 我没有发现问题是基于服务器还是在我的应用程序中。但现在我使用GoogleVolley作为我的API,它的工作非常棒!

1 个答案:

答案 0 :(得分:0)

阅读AsyncTask'threadpoolexecutor'

上的文档

尝试确定平台API升级是否以某种方式转移了池的默认策略以及asyncTask使用的线程数和执行程序?

如果你想要另一种方法来控制你自己的客户端池化的http执行器,look here例如使用android处理程序为异步http队列运行你自己的框架。