http://blog.csdn.net/zhaokaiqiang1992/article/details/30291259?utm_source=tuicool

在之前的一篇文章中,我们简单的介绍了下FinalBitmap的使用,这一篇文章将继续介绍AFinal开发框架的使用,这一次的主角是FinalHttp。

FinalHttp,顾名思义,就是一个用于实现客户端与服务器之间网络通信的类,这个类主要通过对Apache的HttpClient开源项目进行封装,实现了http、https协议下的"GET"和"Post"两种请求方式,以及put、delete、download等功能,我们主要介绍使用FinalHttp实现与服务器的      "GET"和"Post"两种交互方式      。

  1. private static final ThreadFactory sThreadFactory = new ThreadFactory() {
  2. private final AtomicInteger mCount = new AtomicInteger(1);
  3. public Thread newThread(Runnable r) {
  4. Thread tread = new Thread(r, "FinalHttp #" + mCount.getAndIncrement());
  5. tread.setPriority(Thread.NORM_PRIORITY - 1);
  6. return tread;
  7. }
  8. };
  9.  
  10. private static final Executor executor =Executors.newFixedThreadPool(httpThreadCount, sThreadFactory);

首先,FinalHttp采用的是线程池的方式,提供对请求的异步加载,默认的是启动3个固定的线程。而且,

  1. tread.setPriority(Thread.NORM_PRIORITY - 1);

这句代码将这些线程的优先级设置的比普通线程低,目前不知道是出于何种考虑。

另外,在FinalHttp的构造函数中,进行了很多属性的初始化操作,包括添加请求头、设置超时的时间、设置重试次数等,代码较多,还请读者自己去阅读。

FinalHttp对      "GET"和"Post"进行了非常好的封装,所以使用起来非常简单,下面,我们简要的学习一下FinalHttp的使用。

首先,我们可以通过

FinalHttp    http    =    new         FinalHttp();

就可以很方便的获取到一个FinalHttp的对象。

如果我们想实现最简单的GET请求,比如我们用GET方式,请求百度的主页,我们可以这样做

  1. public void get(View view) {
  2. //这是最简单的get请求,前面是请求地址,不要忘记添加http://
  3. //后面是一个回调函数,比较常用的方法有下面两个
  4. http.get("http://www.baidu.com", new AjaxCallBack<String>() {
  5.  
  6. //当我们请求失败的时候会被调用,errorNo是请求失败之后,服务器的错误码,StrMsg则是错误信息
  7. @Override
  8. public void onFailure(Throwable t, int errorNo, String strMsg) {
  9. super.onFailure(t, errorNo, strMsg);
  10. Log.d(TAG, strMsg);
  11. }
  12.  
  13. //如果请求成功,则调用这个回调函数,t就是服务器返回的字符串信息
  14. @Override
  15. public void onSuccess(String t) {
  16. super.onSuccess(t);
  17. Log.d(TAG, t);
  18. }
  19.  
  20. });
  21. }

我们可以看到,用FinalHttp实现GET网络请求,我们不需要自己开线程,因为框架已经封装好了,在内部给我们开的线程,实现网络的异步调用。其实不光有get方法,还有一个getSync,这个方法就是没有进行另起线程的请求,所以,如果我们想用getSync这个方法,我们需要自己开启线程,否则在最新版本的主线程中开启网络服务,会抛异常。

当然,这只是最简单的get方法的使用,FinalHttp一共提供了get方法的三种重载,代码如下

  1. //------------------get 请求-----------------------
  2. public void get( String url, AjaxCallBack<? extends Object> callBack) {
  3. get( url, null, callBack);
  4. }
  5.  
  6. public void get( String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
  7. sendRequest(httpClient, httpContext, new HttpGet(getUrlWithQueryString(url, params)), null, callBack);
  8. }
  9.  
  10. public void get( String url, Header[] headers, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
  11. HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
  12. if(headers != null) request.setHeaders(headers);
  13. sendRequest(httpClient, httpContext, request, null, callBack);
  14. }

第二种方式增加了AjaxParams参数,这个参数负责设置get请求的请求值,就是get请求时url地址后面的 &key1=values1  &key2=values2这种形式的请求参数的设置,内部其实就是通过Map<String,String>实现的,所以使用也和Map一样。但是这个AjaxParams比较强大,我们可以往里面添加很多东西,比如说文件,流等。

第三种方式又增加了一个Header数组,这个数组用于设置请求的头信息,其他与以上两种相同。

  1. public Object getSync( String url) {
  2. return getSync( url, null);
  3. }
  4.  
  5. public Object getSync( String url, AjaxParams params) {
  6. HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
  7. return sendSyncRequest(httpClient, httpContext, request, null);
  8. }
  9.  
  10. public Object getSync( String url, Header[] headers, AjaxParams params) {
  11. HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
  12. if(headers != null) request.setHeaders(headers);
  13. return sendSyncRequest(httpClient, httpContext, request, null);
  14. }

这是getSync的实现,其实和get方法一样,只不过因为需要自己另开线程,所以没有了回调函数这个参数,使用方法相同。

下面我们看一下post方法使用。

  1. //------------------post 请求-----------------------
  2. public void post(String url, AjaxCallBack<? extends Object> callBack) {
  3. post(url, null, callBack);
  4. }
  5.  
  6. public void post(String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
  7. post(url, paramsToEntity(params), null, callBack);
  8. }
  9.  
  10. public void post( String url, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) {
  11. sendRequest(httpClient, httpContext, addEntityToRequestBase(new HttpPost(url), entity), contentType, callBack);
  12. }
  13.  
  14. public <T> void post( String url, Header[] headers, AjaxParams params, String contentType,AjaxCallBack<T> callBack) {
  15. HttpEntityEnclosingRequestBase request = new HttpPost(url);
  16. if(params != null) request.setEntity(paramsToEntity(params));
  17. if(headers != null) request.setHeaders(headers);
  18. sendRequest(httpClient, httpContext, request, contentType, callBack);
  19. }
  20.  
  21. public void post( String url, Header[] headers, HttpEntity entity, String contentType,AjaxCallBack<? extends Object> callBack) {
  22. HttpEntityEnclosingRequestBase request = addEntityToRequestBase(new HttpPost(url), entity);
  23. if(headers != null) request.setHeaders(headers);
  24. sendRequest(httpClient, httpContext, request, contentType, callBack);
  25. }

上面的代码中,我们可以看出,post与get方法的使用几乎相同,只不过增加了几个新的参数而已。

下面是调用post方法的一个简单的示例

  1. public void post(View view) {
  2. http.post("http://www.baidu.com", new AjaxCallBack<String>() {
  3.  
  4. @Override
  5. public void onFailure(Throwable t, int errorNo, String strMsg) {
  6. super.onFailure(t, errorNo, strMsg);
  7. Log.d(TAG, strMsg);
  8. }
  9.  
  10. @Override
  11. public void onSuccess(String t) {
  12. super.onSuccess(t);
  13. Log.d(TAG, t);
  14. }
  15.  
  16. });

我们通过    AjaxParams     可以来添加文件,然后就可以使用post方法,将文件提交到服务器,实现文件的上传。

AjaxParams params = new AjaxParams();              params.put("username", "michael yang");              params.put("password", "123456");              params.put("email", "test@tsz.net");              params.put("profile_picture", new File("/mnt/sdcard/pic.jpg")); // 上传文件        params.put("profile_picture2", inputStream); // 上传数据流        params.put("profile_picture3", new ByteArrayInputStream(bytes)); // 提交字节流

FinalHttp的简要介绍与使用的更多相关文章

  1. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  2. [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...

  3. [转] Android资源管理框架(Asset Manager)简要介绍和学习计划

    转自:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与U ...

  4. Activity启动过程简要介绍

    无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerSe ...

  5. Android应用程序的Activity启动过程简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...

  6. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  7. Android资源管理框架(Asset Manager)简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...

  8. Android应用程序组件Content Provider简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...

  9. Android窗口管理服务WindowManagerService的简要介绍和学习计划

    在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的 实现要更复杂,因为它们的类型和作用不同,且会相互影响. ...

随机推荐

  1. asp.net core部署时自定义监听端口,提高部署的灵活性

    另一种方式 https://www.cnblogs.com/stulzq/p/9039836.html 代码截图: 贴一下代码,方便复制: //默认端口号5000 string port = &quo ...

  2. .Net并行编程(一)-TPL之数据并行

    前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...

  3. C_数据结构_递归不同函数间调用

    # include <stdio.h> void f(); void g(); void k(); void f() { printf("FFFF\n"); g(); ...

  4. 作业20171130 final发布 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月16日 17:00. 更新 第一周和第二周成绩分别应占比20%和10%,计算时刚好反了.所以同学们的最终成绩有变 ...

  5. mac系统下修复第三方Python包bug

    发现问题 今天在github上fork了CI 3.x的中文手册,按照README文档一步步进行Sphinx和相关工具的安装,最终build生成html版手册.操作到第6步执行`make html`的时 ...

  6. JUnit4 单元测试

    一. 题目简介 这次的单元测试我作了一个基本运算的程序,该程序实现了加,减,乘,除,平方,倒数的运算,该程序进行测试比较的简单,对于初步接触JUnit的我来说测试起来也比较容易理解. 二.源码的git ...

  7. JS 柯里化 (curry)

    用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...

  8. 在centos7虚拟机上挂载镜像,并设置yum源(包括遇到的问题)

    挂载镜像方法很简单: mkdir /etc/a mount /dev/cdrom /etc/a 查看挂载情况  : df -h 修改yum源文件 : 先把 CentOS-Base.repo 文件名改一 ...

  9. Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法

    USE mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';FLUSH PR ...

  10. python主成分分析

    #-*- coding: utf-8 -*- #主成分分析 降维 import pandas as pd #参数初始化 inputfile = '../data/principal_component ...