Android响应超时

时间:2012-03-15 07:56:35

标签: android https httpwebrequest httprequest

嗨我的应用程序从服务器请求一些数据,应用程序向用户显示Dialog直到应用程序收到结果,但在某些情况下应用程序没有收到任何响应并且没有发生超时并且对话框永远保留在屏幕上。

以下是HttpClient的代码。

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
    HttpProtocolParams.setUseExpectContinue(params, true);  
     // Turn off stale checking. Our connections break all the time anyway,
    // and it's not worth it to pay the penalty of checking every time.
    HttpConnectionParams.setStaleCheckingEnabled(params, false);

    // Default connection and socket timeout of 30 seconds. Tweak to taste.
    HttpConnectionParams.setConnectionTimeout(params, 5*1000);
    HttpConnectionParams.setSoTimeout(params, 30*1000);
    HttpConnectionParams.setSocketBufferSize(params, 8192);

    ConnManagerParams.setTimeout(params, 5 * 1000);
    ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(50));
    ConnManagerParams.setMaxTotalConnections(params, 200);

    // Sets up the http part of the service.
    final SchemeRegistry supportedSchemes = new SchemeRegistry();

    // Register the "http" protocol scheme, it is required
    // by the default operator to look up socket factories.
    final SocketFactory sf = PlainSocketFactory.getSocketFactory();
    supportedSchemes.register(new Scheme("http", sf, 80));
    supportedSchemes.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
    final ThreadSafeClientConnManager ccm = new ThreadSafeClientConnManager(params,
            supportedSchemes);

    DefaultHttpClient httpClient = new DefaultHttpClient(ccm, params);`

如果出现问题,请指明错误或其他一些代码建议。

3 个答案:

答案 0 :(得分:1)

好像你让TimeOut完成太复杂了。尝试如下:

//TimeOut is set to 20 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);
HttpClient client = new DefaultHttpClient(httpParams);

答案 1 :(得分:1)

建议:

当对话框显示时,需要向处理程序发送延迟消息,当收到延迟消息时,关闭对话框并取消请求

Hanlder.sendEmptyMessageDelayed(what,delay_time)

HttpUriRequest.abort取消请求

您可以假设超时的延迟时间或您认为最长的时间。

答案 2 :(得分:0)

我在我的一个项目中面临同样的问题。

HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);

但我不知道为什么上面的代码片段不能在随机场合工作。时间已经过去了但是 在我的情况下不是20秒。

所以我想出了一点hacky方法。我知道它不推荐。但你可能会发现它很有用。 您将有3个场景,您将关闭对话框并继续。

1)收到回复后立即解除对话。

2)如果发生超时,则关闭对话框

3)写一个逻辑来解雇handler.post dealyed中的对话框。确保你总是提到你在setSoTimeout中给出的延迟(不推荐但有用)

因此,在最坏的情况下,如果您在提到的超时持续时间内没有收到响应/超时。 第三种方法永远有效。

希望得到这个帮助。