您的位置:首页 > 理论基础 > 计算机网络

Android-Async-httpClient 开源代码分析

2014-08-02 17:55 399 查看
一,AysncHttpClient 类:

Android-Async-httpClient核心类,包括在构造方法中初始化DefaultHttpClient的参数属性等,包括设置请求拦截器和响应拦截器,设置重试handler。

1,线程池。

AysncHttpClient利用线程池来管理请求线程,通过调调用Executors.newCachedThreadPool()来创建线程池,该线程池会根据需要来创建线程,如果构造的线程可用时候会重用他们,如果现有线程没有可用的,则创建新的线程并加入到线程池,会终止并移除那些已经有60秒没有被使用的线程。

2,请求拦截器,响应拦截器。

在构造方法中设置了HttpClient请求拦截器和响应拦截器,在请求拦截器中处理了请求头Header参数和认证。响应拦截器中处理压缩文件的处理,response.setEntity(new InflatingEntity(entity));设置GZIPInputStream。

3,请求重试机制。

httpClient.setHttpRequestRetryHandler(new RetryHandler(DEFAULT_MAX_RETRIES, DEFAULT_RETRY_SLEEP_TIME_MILLIS));通过设置请求重试handler实现了5次的重试和1.5秒的延迟重试时间。

RetryHandler定义了那些异常需要重试那些异常则不需要重试。对于:NoHttpResponseException,UnknownHostException,SocketException异常需要重试;InterruptedIOException,SSLException则不需要重试。

4,支持重定向。

通过调用httpClient.getParams().setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, enableCircularRedirects),支持环形重定向,即支持重定向之前重复的地址。

5,发送请求。

调用sendRequest()方法,每次请求都会新建一个请求线程AsyncHttpRequest,并启动此线程。然后新建一个请求手柄RequestHandle,该请求手柄含有AsyncHttpRequest的引用,用来管理AsyncHttpRequest,包括取消请求任务cancel和清除任务,每个RequestHandle都会保存在List中,该List又保存在Map中,键值对context-List。

二,MyRedirectHandler类:

重定向Handler类,继承自DefaultRedirectHandler,当需要重定向时候,则重定向。

1,重写isRedirectRequested方法,当服务器返回301,302,303,307时isRedirectRequested方法返回true,其他返回false。

2,重写getLocationURI方法,返回重定向的uri,从Header中获取重定向的地址,

Header locationHeader = response.getFirstHeader("location");

String location = locationHeader.getValue().replaceAll(" ", "%20");


注意:当重定向地址和前一个请求地址相同时,需要设置环形重定向,否则会报CircularRedirectException,如:

httpClient.getParams().setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);

运用:httpClient.setRedirectHandler(new MyRedirectHandler(enableRedirects));

三,MySSLSocketFactory类:

SSL安全套接字工厂类,继承自SSLSocketFactory,用于https加密请求。

本文引用文章:

HttpClient的CircularRedirectException异常原因及解决办法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: