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】:使用HttpConnectionParams
的DefaultHttpClient
::
final HttpParams httpParameters = yourHttpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeOutSec * 1000);
HttpConnectionParams.setSoTimeout (httpParameters, socketTimeoutSec * 1000);
【讨论】:
超时很好,但是我们如何捕捉超时(现在的代码只是在超时时静默失败) 当它失败时,这段代码会抛出一个你可以捕捉和处理的异常。 “这个”代码是指 OP 的代码。如今,根据Android的官方博客,无论如何最好使用HttpUrlConnection而不是DefaultHttpClient。以上是关于DefaultHttpClient 类 Android 中的超时的主要内容,如果未能解决你的问题,请参考以下文章
DefaultHttpClient 到 AndroidHttpClient