DefaultHttpClient 类 Android 中的超时

Posted

技术标签:

【中文标题】DefaultHttpClient 类 Android 中的超时【英文标题】:Timeout in DefaultHttpClient Class Android 【发布时间】:2011-11-05 22:47:52 【问题描述】:

我创建了一个 android 应用程序,我在其中连接到远程服务器 php 文件以检索一些信息。下面是代码。

在这里我想为连接添加超时,例如连接将在 5 秒内超时。

任何想法如何做到这一点。

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("name","test"));

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://mysite.com/test.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost); 

问候,

香卡

【问题讨论】:

【参考方案1】:
final HttpParams httpParameters = yourHttpClient.getParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeOutSec * 1000);
HttpConnectionParams.setSoTimeout        (httpParameters, socketTimeoutSec * 1000);

如果这不起作用(如我的情况)。试试这个对我有用的 (link)

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();

// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

【讨论】:

请注意,将 BasicHttpParams 传递给 DefaultHttpClient 会导致默认 HTTP 连接参数丢失。这意味着除非特别添加回来,否则 User-Agent 不会出现在 HTTP 标头中。 很好,但是从 Apache HttpCore 4.3 开始不推荐使用 HttpConnectionParams【参考方案2】:

使用HttpConnectionParamsDefaultHttpClient::

final HttpParams httpParameters = yourHttpClient.getParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeOutSec * 1000);
HttpConnectionParams.setSoTimeout        (httpParameters, socketTimeoutSec * 1000);

【讨论】:

超时很好,但是我们如何捕捉超时(现在的代码只是在超时时静默失败) 当它失败时,这段代码会抛出一个你可以捕捉和处理的异常。 “这个”代码是指 OP 的代码。如今,根据Android的官方博客,无论如何最好使用HttpUrlConnection而不是DefaultHttpClient。

以上是关于DefaultHttpClient 类 Android 中的超时的主要内容,如果未能解决你的问题,请参考以下文章

android 怎么使用httpurlconnection

DefaultHttpClient 到 AndroidHttpClient

DefaultHttpClient使用

DefaultHttpClient 更改响应大小?

Android 上 DefaultHttpClient 中连接和套接字超时的默认值是啥?

Android Wigets 不能使用自定义 DefaultHttpClient