http 连接超时问题

当我尝试使用HttpClient连接到URL时,我遇到了一个问题。http连接需要更长的时间来超时,即使在我设置了连接超时之后也是如此。

int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

它在大多数情况下都很完美。但是,每隔一段时间,http连接就会永远运行,并且忽略,特别是当手机连接到wifi并且手机处于空闲状态时。setconnectiontimeout

因此,在手机闲置后,我第一次尝试连接时,http连接会忽略并永远运行,在我取消它并重试后,它每次都像魅力一样工作。但是有一次不起作用会产生错误,我尝试使用不同的线程,它有效,但我知道线程正在运行很长时间。setconnectiontimeoutthreadtimeout

我知道wifi在闲置时进入睡眠状态,但我不明白为什么它忽略了.setconnectiontimeout

任何人都可以帮忙,id真的很感激。


答案 1

不确定这是否对您有帮助,但我认为值得在这里分享。在玩超时内容时,我发现您可以分配第三种超时类型:

// the timeout until a connection is established
private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */

// the timeout for waiting for data
private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */

// ----------- this is the one I am talking about:
// the timeout until a ManagedClientConnection is got 
// from ClientConnectionRequest
private static final long MCC_TIMEOUT = 5000; /* 5 seconds */

...

HttpGet httpGet = new HttpGet(url);
setTimeouts(httpGet.getParams());

...

private static void setTimeouts(HttpParams params) {
    params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 
        CONNECTION_TIMEOUT);
    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
    params.setLongParameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT);
}

答案 2

我遇到了同样的问题,我想也许Android不支持这个参数。在我的情况下,我测试了ThreadSafeClientConnManager的所有三个参数。

params.setParameter( ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(20) );
params.setIntParameter( ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 200 );
params.setLongParameter( ConnManagerPNames.TIMEOUT, 10 );
ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager( params );

第一个和第二个工作正常,但第三个没有按照记录工作。没有抛出异常,并且在执行 DefaultHttpClient#execute() 时,执行线程被无限期阻塞。

请参阅 http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e650
“...可以通过将“http.conn-manager.timeout”设置为正值来确保连接管理器不会在连接请求操作中无限期地阻塞。如果在给定的时间段内无法处理连接请求,则将引发连接池超时异常。


推荐