FinalHttp的简要介绍与使用
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"两种交互方式 。
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
Thread tread = new Thread(r, "FinalHttp #" + mCount.getAndIncrement());
tread.setPriority(Thread.NORM_PRIORITY - 1);
return tread;
}
};
private static final Executor executor =Executors.newFixedThreadPool(httpThreadCount, sThreadFactory);
首先,FinalHttp采用的是线程池的方式,提供对请求的异步加载,默认的是启动3个固定的线程。而且,
tread.setPriority(Thread.NORM_PRIORITY - 1);
这句代码将这些线程的优先级设置的比普通线程低,目前不知道是出于何种考虑。
另外,在FinalHttp的构造函数中,进行了很多属性的初始化操作,包括添加请求头、设置超时的时间、设置重试次数等,代码较多,还请读者自己去阅读。
FinalHttp对 "GET"和"Post"进行了非常好的封装,所以使用起来非常简单,下面,我们简要的学习一下FinalHttp的使用。
首先,我们可以通过
FinalHttp http = new FinalHttp();
就可以很方便的获取到一个FinalHttp的对象。
如果我们想实现最简单的GET请求,比如我们用GET方式,请求百度的主页,我们可以这样做
public void get(View view) {
//这是最简单的get请求,前面是请求地址,不要忘记添加http://
//后面是一个回调函数,比较常用的方法有下面两个
http.get("http://www.baidu.com", new AjaxCallBack<String>() {
//当我们请求失败的时候会被调用,errorNo是请求失败之后,服务器的错误码,StrMsg则是错误信息
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
Log.d(TAG, strMsg);
}
//如果请求成功,则调用这个回调函数,t就是服务器返回的字符串信息
@Override
public void onSuccess(String t) {
super.onSuccess(t);
Log.d(TAG, t);
}
});
}
我们可以看到,用FinalHttp实现GET网络请求,我们不需要自己开线程,因为框架已经封装好了,在内部给我们开的线程,实现网络的异步调用。其实不光有get方法,还有一个getSync,这个方法就是没有进行另起线程的请求,所以,如果我们想用getSync这个方法,我们需要自己开启线程,否则在最新版本的主线程中开启网络服务,会抛异常。
当然,这只是最简单的get方法的使用,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);
}
第二种方式增加了AjaxParams参数,这个参数负责设置get请求的请求值,就是get请求时url地址后面的 &key1=values1 &key2=values2这种形式的请求参数的设置,内部其实就是通过Map<String,String>实现的,所以使用也和Map一样。但是这个AjaxParams比较强大,我们可以往里面添加很多东西,比如说文件,流等。
第三种方式又增加了一个Header数组,这个数组用于设置请求的头信息,其他与以上两种相同。
public Object getSync( String url) {
return getSync( url, null);
}
public Object getSync( String url, AjaxParams params) {
HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
return sendSyncRequest(httpClient, httpContext, request, null);
}
public Object getSync( String url, Header[] headers, AjaxParams params) {
HttpUriRequest request = new HttpGet(getUrlWithQueryString(url, params));
if(headers != null) request.setHeaders(headers);
return sendSyncRequest(httpClient, httpContext, request, null);
}
这是getSync的实现,其实和get方法一样,只不过因为需要自己另开线程,所以没有了回调函数这个参数,使用方法相同。
下面我们看一下post方法使用。
//------------------post 请求-----------------------
public void post(String url, AjaxCallBack<? extends Object> callBack) {
post(url, null, callBack);
} public void post(String url, AjaxParams params, AjaxCallBack<? extends Object> callBack) {
post(url, paramsToEntity(params), null, callBack);
} public void post( String url, HttpEntity entity, String contentType, AjaxCallBack<? extends Object> callBack) {
sendRequest(httpClient, httpContext, addEntityToRequestBase(new HttpPost(url), entity), contentType, callBack);
} public <T> void post( String url, Header[] headers, AjaxParams params, String contentType,AjaxCallBack<T> callBack) {
HttpEntityEnclosingRequestBase request = new HttpPost(url);
if(params != null) request.setEntity(paramsToEntity(params));
if(headers != null) request.setHeaders(headers);
sendRequest(httpClient, httpContext, request, contentType, callBack);
} public void post( String url, Header[] headers, HttpEntity entity, String contentType,AjaxCallBack<? extends Object> callBack) {
HttpEntityEnclosingRequestBase request = addEntityToRequestBase(new HttpPost(url), entity);
if(headers != null) request.setHeaders(headers);
sendRequest(httpClient, httpContext, request, contentType, callBack);
}
上面的代码中,我们可以看出,post与get方法的使用几乎相同,只不过增加了几个新的参数而已。
下面是调用post方法的一个简单的示例
public void post(View view) {
http.post("http://www.baidu.com", new AjaxCallBack<String>() {
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
Log.d(TAG, strMsg);
}
@Override
public void onSuccess(String t) {
super.onSuccess(t);
Log.d(TAG, t);
}
});
我们通过 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的简要介绍与使用的更多相关文章
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. ...
- [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...
- [转] Android资源管理框架(Asset Manager)简要介绍和学习计划
转自:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与U ...
- Activity启动过程简要介绍
无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerSe ...
- Android应用程序的Activity启动过程简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...
- Dalvik虚拟机简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...
- Android资源管理框架(Asset Manager)简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...
- Android应用程序组件Content Provider简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...
- Android窗口管理服务WindowManagerService的简要介绍和学习计划
在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的 实现要更复杂,因为它们的类型和作用不同,且会相互影响. ...
随机推荐
- Linux安装middleBox之prads
PRADS prads github安装 prads github 项目 prads github命令
- Qt小项目之串口助手控制LED
Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...
- WPF开发汽车采样机上位机软件
由于项目需要,需开发同一套汽车.火车.皮带采样机的上位机软件. 看过之前的上位机软件,老版本都是DelPhi.VB开发,稍微新语言开发的是采用winform开发.要不就是使用组态软件. Delphi语 ...
- Quartz.Net分布式任务管理平台(续)
感谢@Taking园友得建议,我这边确实多做了一步上传,导致后面还需处理同步上传到其他服务器来支持分布式得操作.所有才有了上篇文章得完善. 首先看一下新的项目结构图: 这个图和上篇文章中 ...
- checkpoint-BLCR部署和测试(源码)
1. 概述2. 部署过程2.1 源码下载2.2 解压安装2.3 添加库环境2.4 插入内核模块3. 测试3.1 创建测试程序3.2 功能测试4. 参考博客 1. 概述 checkpoint 2. 部署 ...
- Linux mount 命令进阶
笔者在<Linux mount 命令>一文中介绍了 mount 命令的基本用法,本文我们接着介绍 mount 命令的一些高级用法,比如 bind mounts(绑定挂载)和 shared ...
- Zookeeper 源码学习(一)环境搭建
前言 最近准备学习 Zookeeper,想从 Zookeeper 开始逐步深入了解各类中间件,学习分布式计算. 下载源码 执行指令,下载代码: git clone https://github.com ...
- Flask之WSGI:Werkzeug
WSGI 一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP响应的Body发送给浏览器: 浏览器收到HTTP响应,从HT ...
- beta阶段测试基本概况对应机型硬件信息
机型测试概况 测试结果 测试终端数 品牌分布分析 系统分布分析 分辨率分布 未执行 1 联想 4.0.3 480*800 安装失败 1 联想 4.2.1 480*854 通过 119 华为, 三星, ...
- hover设定触发时间间隔
500毫秒执行一次 $(".banner_menu_content li a").hover(function(){ var aa=$(this).text().trim(); s ...