一,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异常原因及解决办法