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一步一脚的更多相关文章

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

    Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  2. 【开源项目3】Android快速开源框架--afinal

    Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...

  3. Afinal开源框架中FinalActivity的使用

    1. 首先将afinal.jar文件复制到项目中的libs文件夹下 2. 让MainActivity不在继承系统的Activity,而是继承FinalActivity public class Mai ...

  4. Farseer.net轻量级ORM开源框架 V1.x 教程目录

    本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...

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

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

  6. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  7. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  8. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  9. 六款值得推荐的android(安卓)开源框架简介

    1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduli ...

随机推荐

  1. C/C++中连接函数strcat的应用(简单讲解)

    有位学弟问到我如何将两个字符连接起来,想想java/python里面可以直接用+连接起来,可是C/C++里面有没有这么方便的做法呢? 答案是有的,在C语言的string.h库中有个神奇的函数叫做str ...

  2. L2-027. 名人堂与代金券

    链接:名人堂与代金券 在比赛中这题只得了2分,赛后发现原来strcmp函数并不是只返回-1,0,1三种,而是返回正数负数0 但是在我的电脑上一般就是返回前三种,只是用后面的三种更稳妥点 都怪我基础不扎 ...

  3. UVA - 116 Unidirectional TSP 多段图的最短路 dp

    题意 略 分析 因为字典序最小,所以从后面的列递推,每次对上一列的三个方向的行排序就能确保,数字之和最小DP就完事了 代码 因为有个地方数组名next和里面本身的某个东西冲突了,所以编译错了,后来改成 ...

  4. 898 C. Phone Numbers

    传送门 [http://codeforces.com/contest/898/problem/C] 题意 题意比较难理解直接看样例就知道了,给你个n接下来n行,每行包括一个名字和号码的数量,还有具体的 ...

  5. Finished yeah!

    终于到了最后的博客阶段,这时候才知道博客此时此刻是多么的惬意,它成了书写心声的自由平台!耗时一天完成这作业说起来也是蛮辛苦的,编译器需要新装,IDE需要熟悉,当然最主要的是之前浅入浅出的C++功底在此 ...

  6. week4--系统调用的工作机制

    潘恒 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用库函数AP ...

  7. 20135337——linux第四次实践:字符集总结与分析

    ASCII & GB2312 & UTF-8 ASCII 主要用于显示现代英语和其他西欧语言.它是现今最通用的单字节编码系统,并等同于国际标准ISO 646: 7位(bits)表示一个 ...

  8. Linux第五周学习总结

    作者:黎静 一.知识点总结 (一)给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.test.c中main函数里,增加MenuConfig() 3.增加对应的两个函数 ...

  9. org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: c

    //这个是 配置文件放错了地方 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing ...

  10. Spring源码阅读学习一

    昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...