FinalHttp 使用教程

1.FinalHttp是什么FinalHttp HttpClient再次封装,最简洁的就是增加了许多回调的方法,对Get Post 请求进行了简化。另外一点就是FinalHttp加入线程池操作,默认的Http请求池连接为3。下面是为FinalHttp可配置的操作。

FinalHttp finalHttp = new FinalHttp();
finalHttp.addHeader("Accept-Charset", "UTF-8");//配置http请求头
finalHttp.configCharset("UTF-8");
finalHttp.configCookieStore(null);
finalHttp.configRequestExecutionRetryCount(3);//请求错误重试次数
finalHttp.configSSLSocketFactory(null);
finalHttp.configTimeout(5000);//超时时间
finalHttp.configUserAgent("Mozilla/5.0");//配置客户端信息


2.FinalHttp Get

//------------------get 请求-----------------------
public void get( String url, AjaxCallBack<? extends Object> callBack) {
get( url, null, callBack);
}

public void get( String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {

sendRequest(httpClient, httpContext, new HttpGet(getUrlWithQueryString(url, params)), null, callBack);

}

public void get( String url, Header[] headers, AjaxParams params, AjaxCallBack<? extends Object> callBack) {

HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
if(headers != null) request.setHeaders(headers);
sendRequest(httpClient, httpContext, request, null, callBack);

}



三个方法的却别在于:第二个增加了参数。第三个增加了http header。,此处,AjaxParams是一个 map集合。来看看 sendRequest方法。

protected <T> void sendRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, String contentType, AjaxCallBack<T> ajaxCallBack) {
if(contentType != null) {
uriRequest.addHeader("Content-Type", contentType);
}


new HttpHandler<T>(client, httpContext, ajaxCallBack,charset)



.executeOnExecutor(executor, uriRequest);

}



这里面直接调用了一个类HttpHandlerexecuteOnExecutor方法,传入了一个重要的参数executor。看看这个类:HttpHandler

public class HttpHandler <T> extends AsyncTask<Object, Object, Object> implements EntityCallBack{

private final AjaxCallBack<T> callback;

private int executionCount = 0;

public HttpHandler(AbstractHttpClient client, HttpContext context, AjaxCallBack<T> callback,String charset) {

this.client = client;
this.context = context;
this.callback = callback;
this.charset = charset;

}



这个类继承了 AsyncTask,这个 AsyncTask是作者自定义的,它相对于android自带的 AsyncTask:修改了线程池属性,让并发线程按顺序执行。之前好像有人提到使用 afinal加载图片是一个一个加载的,原因可能就在这里了。
这个类还实现了自定义的一个接口,里面的这个方法是我们回调的方法:

public interface EntityCallBack {

public void callBack(long count,long current,boolean mustNoticeUI);

}



这表明了HttpHandler是一个异步加载类,我精简掉方法中暂时不用的代码,很显然,他的异步方法应该在这个方法中执行doInBackground

@Override

protected Object doInBackground(Object... params) {

try {
publishProgress(UPDATE_START); // 开始
makeRequestWithRetries((HttpUriRequest)params[0]);//调用
} catch (IOException e) {
publishProgress(UPDATE_FAILURE,e,0,e.getMessage()); // 结束
}

return null;

}

private void makeRequestWithRetries(HttpUriRequest request) throws IOException {

boolean retry = true;
IOException cause = null;
HttpRequestRetryHandler retryHandler = client.getHttpRequestRetryHandler();
while (retry) {
try {
if (!isCancelled()) {
[color=Red]HttpResponse response = client.execute(request, context);[/color]//这里就开始执行了
if (!isCancelled()) {
handleResponse(response);
}
}
return;
} catch (UnknownHostException e) {
publishProgress(UPDATE_FAILURE,e,0,"unknownHostException:can't resolve host");
return;
} catch (IOException e) {
cause = e;
retry = retryHandler.retryRequest(cause, ++executionCount,context);
} catch (NullPointerException e) {
cause = new IOException("NPE in HttpClient" + e.getMessage());
retry = retryHandler.retryRequest(cause, ++executionCount,context);
}catch (Exception e) {
cause = new IOException("Exception" + e.getMessage());
retry = retryHandler.retryRequest(cause, ++executionCount,context);
}
}

if(cause!=null)
throw cause;
else
throw new IOException("未知网络错误");
}



HttpResponse response = client.execute(request, context);这就开始执行了。
retry = retryHandler.retryRequest(cause, ++executionCount,context);
这里出现异常执行一次,次数加一次。直到你设置的次数超过为止,retryHandler就会直接返回false中断 while(retry)


原文地址:http://www.kwstu.com/ArticleView/419895180_20139251051972

 
转载自豆瓣网之大黄豆
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值