0

如果连接或套接字超时,我使用HttpClientand重试。HttpRequestRetryHandler所以我关闭了我的连接并调用了期望HttpRequestRetryHandler被调用的 API。但它不会被调用。甚至没有输入方法。

代码 :

HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT,
            CONNECTION_TIMEOUT * 1000);
client.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,
            SOCKET_TIMEOUT * 1000);

// Retry handler which handles request retry
HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {

    @Override
    public boolean retryRequest(IOException exception,
                int executionCount, HttpContext context) {

        if ((exception instanceof ConnectTimeoutException || exception instanceof SocketTimeoutException)
                    && executionCount <= MAX_TRIES) {

            Log.d(TAG, "Retrying connection.");
            return true;

        } 

        return false;
    }
};

((AbstractHttpClient) client)
            .setHttpRequestRetryHandler(requestRetryHandler);

但同时我尝试ConnectTimeoutException如下所示进行捕获,并且执行确实进入了ConnectTimeoutException.

try {

    // Making API request

} catch (ConnectTimeoutException ce) {

    // Execution enters here
    ce.printStackTrace();
}

我的 avd 在 android 版本的果冻豆上运行。

代码有什么问题吗?

打印 ConnectTimeoutException 跟踪时的 Logcat:

在此处输入图像描述

4

3 回答 3

2

我有同样的问题,我想分享我的解决方案(为我工作)。

许多一般使用的 HTTP 服务器被配置为在一段时间不活动后丢弃持久连接,以节省系统资源,通常不会通知客户端。请参阅HttpClient 连接保持活动策略

如果服务器断开连接,您的 HttpRequestRetryHandler 将没有机会再试一次(完成它的工作)。

所以我以这种方式解决了:

  1. 实施了自定义连接保持活动策略

    mHttpClient.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
        // Honor 'keep-alive' header
        HeaderElementIterator it = new BasicHeaderElementIterator(
            response.headerIterator(HTTP.CONN_KEEP_ALIVE));
        while (it.hasNext()) {
            HeaderElement he = it.nextElement();
            String param = he.getName(); 
            String value = he.getValue();
            if (value != null && param.equalsIgnoreCase("timeout")) {
                try { return Long.parseLong(value) * 1000; } 
                catch(NumberFormatException ignore) {  }
            }
        }
    
        ......
    
        //.Keep Alive for 30 secs
        return 30 * 1000;
      }
    });
    
  2. 然后我实现了自定义重试处理程序:

    HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
    
        public boolean retryRequest(IOException exception, 
                                    int executionCount, 
                                    HttpContext context) {
            // retry a max of 5 times
            if (executionCount >= 5) return false;
    
            if (exception instanceof NoHttpResponseException) {
                // Retry if the server dropped connection on us
                return true;
            }
    
            //.TODO your custom logic...
    
            Boolean b = (Boolean)
                context.getAttribute(ExecutionContext.HTTP_REQ_SENT);
            boolean sent = (b != null && b.booleanValue());   
            if (!sent) {
                // Retry if the request has not been sent fully or
                // if it's OK to retry methods that have been sent
                return true;
            }
    
            // otherwise do not retry
            return false;
        }
    };
    
    mHttpClient.setHttpRequestRetryHandler(retryHandler); 
    
于 2013-07-05T10:31:01.293 回答
0

试试StandardHttpRequestRetryHandler

我认为 HttpRequestRetryHandler öacks 是必要的实现。

DefaultHttpRequestHandler是另一种选择

于 2013-06-28T10:43:46.840 回答
0

我遇到了同样的问题,为我解决的问题是使用 requestSentRetryEnabled = true 初始化我的自定义处理程序。即使用:

static DefaultHttpRequestRetryHandler myCustomHandler = new DefaultHttpRequestRetryHandler(2, true) {
...
}

代替:

static DefaultHttpRequestRetryHandler myCustomHandler = new DefaultHttpRequestRetryHandler() {
...
}
于 2018-03-07T13:56:02.803 回答