http连接超时问题

Mar*_*ark 17 java android timeout apache-httpclient-4.x

当我尝试使用连接到网址的HttpClient时,我遇到了一个问题.即使我设置了连接超时后,http连接也需要更长的时间才能超时.

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

int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
Run Code Online (Sandbox Code Playgroud)

它大部分时间都很完美.然而,每隔一段时间,http连接就会永远运行并忽略setconnectiontimeout,特别是当手机连接到wifi时,手机处于空闲状态.

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

我明白wifi在闲置时睡觉,但我不明白为什么它忽略了setconnectiontimeout.

任何人都可以帮忙,我真的很感激.

Vit*_*nko 10

不确定这是否对您有所帮助,但我认为值得在此分享.在玩超时的东西时,我发现你可以分配第三种超时类型:

// 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);
}
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ler 0

您可以自己管理超时,这样您就可以确信,无论连接处于什么状态,除非您收到可接受的响应,否则您的超时将触发并且 http 请求将被中止。