教程] 《开源框架-Afinal》之FinalHttp 01一步一脚
1.FinalHttp是什么 :FinalHttp 对 HttpClient再次封装,最简洁的就是增加了许多回调的方法,对Get 和 Post 请求进行了简化。另外一点就是FinalHttp加入线程池操作,默认的Http请求池连接为3。下面是为FinalHttp可配置的操作。
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//------------------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方法。
1
2
3
4
5
6
7
8
9
|
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); } |
这里面 直接调用了一个类HttpHandler的executeOnExecutor方法,传入了一个重要的参数executor。看看这个类:HttpHandler
1
2
3
4
5
6
7
8
9
10
11
12
|
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 加载图片是一个一个加载的,原因可能就在这里了。
这个类还实现了自定义的一个接口,里面的这个方法是我们回调的方法:
1
2
3
|
public interface EntityCallBack { public void callBack( long count, long current, boolean mustNoticeUI); } |
这表明了HttpHandler 是一个异步加载类,我精简掉方法中暂时不用的代码,很显然,他的异步方法应该在 这个方法中执行doInBackground:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@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 ; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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_2013925101126966
教程] 《开源框架-Afinal》之FinalHttp 01一步一脚的更多相关文章
- Android开源框架Afinal第一篇——揭开圣女的面纱
Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...
- 【开源项目3】Android快速开源框架--afinal
Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...
- Afinal开源框架中FinalActivity的使用
1. 首先将afinal.jar文件复制到项目中的libs文件夹下 2. 让MainActivity不在继承系统的Activity,而是继承FinalActivity public class Mai ...
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- 各种Android UI开源框架 开源库
各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- 六款值得推荐的android(安卓)开源框架简介
1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(scheduli ...
随机推荐
- Intel x86_64 Architecture Background 1
首先讲一下什么是Intel x86,x86是指intel的开发的一种32位指令集,从386开始时代开始的一直沿用至今,是一种cisc指令集.x84_64是x86 CPU开始迈向64位的时候,有2选择: ...
- [清华集训2017]榕树之心[树dp]
题意 题目链接 分析 首先解决 \(subtask3\) ,我们的策略就是进入子树,然后用其它子树来抵消,注意在子树内还可以抵消. 可以转化为此模型:有一个数列 \(a\) ,每次我们可以选定两个值 ...
- mybatis-高级结果映射之一对一
mybatis的高级结果映射可以很轻松的帮助我们处理一对一, 一对多的数据关系. 1 数据准备 1.1 数据库 创建以下的名为 mybatis 的数据库, 并在其下创建4个表. 在此就不贴出来建表的 ...
- springboot+websocket 归纳收集
websocket是h5后的技术,主要实现是一个长连接跟tomcat的comet技术差不多,但websocket是基于web协议的,有更广泛的支持.当然,在处理高并发的情况下,可以结合tomcat的a ...
- Sql_join left right
1.内连接inner join 只返回两张表中所有满足连接条件的行,即使用比较运算符根据每个表中共有的列的值匹配两个表中的行.(inner关键字是可省略的) ①传统的连接写法: 在FROM子句中列出所 ...
- iptables限制连接数(如sftp) 以及 谨防CC/DDOS攻击的配置 ( connlimit模块)
之前在公司服务器上部署了sftp,用于上传业务系统的附件.后来由于程序连接问题,使的sftp连接数过多(最多时高达400多个sftp连接数),因为急需要对sftp的连接数做严格限制.操作记录如下: 启 ...
- 20135327郭皓--Linux内核分析第九周 期中总结
Linux内核分析第九周 期中总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工 ...
- K 班前7次作业成绩汇总
K 班前7次作业成绩汇总 得分榜 千帆竞发 详细 短学号 名 1 2 3 4 5 6 7 TOTAL 505 基智 4.55 1 -2 0 0 -10 4.37 -2.08 414 圳源 5.43 2 ...
- Lucene源码
看Lucene源码必须知道的基本概念 终于有时间总结点Lucene,虽然是大周末的,已经感觉是对自己的奖励,毕竟只是喜欢,现在的工作中用不到的.自己看源码比较快,看英文原著的技术书也很快.都和语言有很 ...
- 『编程题全队』Beta 阶段冲刺博客五
1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.为新建提醒框添加了正则匹配限制 2.添加了新建Reminder的功能 3.初 ...