教程] 《开源框架-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

时间: 2024-10-27 19:26:15

教程] 《开源框架-Afinal》之FinalHttp 01一步一脚的相关文章

Android开源框架Afinal第一篇——揭开圣女的面纱

Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在github的地址:https://github.com/yangfuhai/afinal Afinal这个框架主要分4块: 1.FinalDB模块:android中的orm框架,一行代码就可以进行增删改查.支持一对多,多对一等查询. 2.FinalActivity模块:android中的ioc框架

Android 开源框架 ( 四 ) Afinal --- Android 里的 ORM IOC聚合型框架

Afinal 是一个android的sqlite的 orm 和 ioc 框架.是一种聚合型框架, 大而全.所以不推荐使用,只做了解即可.应付手头临时项目. 推荐阅读,这么多开源框架,该用哪个好?: 一.引言 Afinal是一个开源的android的orm和ioc应用开发框架.在android应用开发中,FinalActivity模块通过Afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定.Afinal的orm框架,很轻松的就可以对android的sqlite数据库进行增删改查操

Afinal开源框架中FinalActivity的使用

1. 首先将afinal.jar文件复制到项目中的libs文件夹下 2. 让MainActivity不在继承系统的Activity,而是继承FinalActivity public class MainActivity extends FinalActivity 3. 把MainActivity中onCreate方法的protected改为public public void onCreate(Bundle savedInstanceState) 4. 在onCreate方法前面使用注解完毕UI

Farseer.Net ORM开源框架 V1.x 教程目录

本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个框架的教程里,我们分为四个阶段,分别是:入门篇.中级篇.高级篇 入门篇:讲述框架的最常用.最基础的一些说明. 中级篇:讲述框架中一些技巧使用. 高级篇:讲述框架的流程原理.详细细述框架里的设计结构. 目录:入门篇 Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明 Farseer.n

开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http://blog.csdn.net/caoyouxing/article/details/42418591 主题 开源 安卓开发 http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自

各开源框架使用与设计总结

一.框架课程总结 框架.设计模式和队列是5月份公开课的三个主题,第一周讲设计模式,第二.四周讲框架,第三周讲队列.框架讲了两周,介绍了框架的概念.PHP框架的应用范围,以及常用的PHP框架,今天是框架的最后一讲,是对整个框架系列课程的汇总,同时和大家讨论一些框架之外.或者框架之下的技术. 今天要讨论的分为这几个方面,总结框架系列课程.探讨框架可能存在,或者解决不了的问题,以及其解决方案和当前的探索. 在框架第一讲中,志华老师也站得高度很高,讲述了框架.架构的概念,以及对比了它的异同.总结来讲就是

Android开发常用流行开源框架记录

发掘了一些Android常用开源框架,记录并分享,希望能在开发当中帮到大家. 缓存: 名称:DiskLruCache 描述:Java实现基于LRU的硬盘缓存 源码地址(可能需要翻墙) 作者:guolin 相关博客:Android DiskLruCache完全解析,硬盘缓存的最佳方案 图片加载: Android-Universal-Image-Loader 描述:一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.所以,如果你的程序里需要这个功能的话,那么不妨

【转载】android 常用开源框架

对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一.  Afinal 官方介绍: Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp. 通过finalActivity,我们可以通过注解的方式进行绑定ui和事件. 通过finalBitmap,我们可以方便的加载bitmap图片,而无

ios常用开源框架

KissXml——xml解析库相关教程:http://www.iteye.com/topic/625849 http://sencho.blog.163.com/blog/static/83056228201151743110540/ 很方便的一个xml解析器,支持Xpath查询. skpsmtpmessage——Quick SMTP邮件发送svn checkout http://skpsmtpmessage.googlecode.com/svn/trunk/ skpsmtpmessage-re