上一篇中我们介绍了OkHttp3.0框架的基本使用方法,这一篇我们学习一下Android的另外一个网络请求框架——AsyncHttpClient框架。Asynchttpclient框架是一个开源的异步网络请求框架,所有的网络都在Android的非UI线程中,通过回调方法处理请求结果,无论是向网络请求数据还是上传数据都非常方便,而且这个框架非常体积非常小,只有90K左右的大小,我们可以轻松使用它,下面我们介绍一下这个框架:

概述

Asynchttpclient框架有如下的特征:

处理异步Http请求,并通过匿名内部类处理回调结果

Http异步请求均位于非UI线程,不会阻塞UI操作

通过线程池处理并发请求处理文件上传、下载,响应结果自动打包JSON格式

自动处理连接断开时请求重连

永久的cookie保存,内部实现用的是Android的SharedPreferences

通过BaseJsonHttpResponseHandler和各种json库集成

支持SAX解析器

支持各种语言和content编码,不仅仅是UTF-8

自动的gzip响应解码

内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中

这里只是简单的介绍一下,具体需要实现细节需要我们在开发中实际去体会。

我们来学习一下Asynchttpclient里面的具体的类:

AsyncHttpRequest类:继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息

AsyncHttpResponseHandler类:接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息

TextHttpResponseHandler类:继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String

JsonHttpResponseHandler类:继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray

BaseJsonHttpResponseHandler类:继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等

RequestParams类:请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件

AsyncHttpClient类:核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行

SyncHttpClient类:继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法

再简单介绍一下Asynchttpclient框架的请求流程:

首先调用AsyncHttpClient的get或post等方法发起网络请求

所有的请求都走了sendRequest,在sendRequest中把请求封装为了AsyncHttpRequest,并添加到线程池执行

当请求被执行时(即AsyncHttpRequest的run方法),执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求,当请求失败时可以重试。并在请求开始,结束,成功或失败时向请求时传的ResponseHandlerInterface实例发送消息

基本上使用的都是AsyncHttpResponseHandler的子类,调用其onStart,onSuccess等方法返回请求结果

关于Asynchttpclient就简单介绍到这里,下面介绍一下Asynchttpclient的具体使用

使用

Asynchttpclient框架的使用步骤基本是:

创建一个AsyncHttpClient对象

通过RequestParams对象设置请求参数,这个是可选择的

调用AsyncHttpClient对象里面的方法,实现请求或者上传数据。这里需要实现内部类回调,框架自己有实现有,不需要我们自己手动实现,我们只需要调用即可。

如果是在Android Studio中使用,需要在gradle中添加:

compile 'com.loopj.android:android-async-http:1.4.9'

如果是Eclipse的话需要去GitHub或者官网下载相应版本的JAR吧,GitHub地址在上文中有给出,下面是Asynchttpclient的官网:http://loopj.com/android-async-http/

下面看一下具体的代码:

AsyncHttpClient client = new AsyncHttpClient();

client.get("https://www.google.com", new AsyncHttpResponseHandler() {

@Override

public void onStart() {

// called before request is started

}

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] response) {

// called when response HTTP status is "200 OK"

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {

// called when response HTTP status is "4XX" (eg. 401, 403, 404)

}

@Override

public void onRetry(int retryNo) {

// called when request is retried

}

});

这里是Get请求的写法,官方推荐我们使用静态的写法:

import com.loopj.android.http.*;

public class TwitterRestClient {

private static final String BASE_URL = "https://api.twitter.com/1/";

private static AsyncHttpClient client = new AsyncHttpClient();

public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {

client.get(getAbsoluteUrl(url), params, responseHandler);

}

public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {

client.post(getAbsoluteUrl(url), params, responseHandler);

}

private static String getAbsoluteUrl(String relativeUrl) {

return BASE_URL + relativeUrl;

}

}

这样方便我们使用。

下面我们使用这个框架实现GET请求、POST请求、文件上传、文件下载这四个功能,这里没有实现保存Cookie的功能,有需要的可以扩展实现:

实现GET请求

我们先看一下具体实现的代码:

AsyncHttpUtils.get(UrlUtils.REQUEST_URL + UrlUtils.URL_KEY, null, new JsonHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, JSONObject response) {

super.onSuccess(statusCode, headers, response);

Log.i(TAG, getResources().getString(R.string.req_success));

Log.i(TAG, "======================================================================");

Log.i(TAG, response.toString());

Log.i(TAG, "======================================================================");

}

@Override

public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {

super.onFailure(statusCode, headers, throwable, errorResponse);

Log.i(TAG, getResources().getString(R.string.req_failed));

}

});

这样就可以实现一个GET请求,请求是在非UI线程中,有请求成功的回调和请求失败的回调,我们更新UI需要通过发消息或者其它方式实现,不能再请求成功的回调方法里面直接更新UI。其中RequestParams是可以选择的,没有请求参数可以直接设置为null。非常简单,就不在做过多的介绍了。

实现POST请求

我们还是先看一下具体的代码:

RequestParams requestParams = new RequestParams();

requestParams.put("username", "Devin");

requestParams.put("password", "Devin");

AsyncHttpUtils.post(UrlUtils.POST_URL, requestParams, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

Log.i(TAG, getResources().getString(R.string.req_success));

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

Log.i(TAG, getResources().getString(R.string.req_failed));

}

});

POST请求需要上传一些参数,框架提供了设置参数的类RequestParams,其中,RequestParams类似于Map,是键值对的形式,添加请求参数有三种方式:

第一种就是像我上面代码一样,创建一个空的RequestParams对象,然后通过put方法将参数写入;

第二种则是创建的时候就直接添加,例如:

RequestParams params = new RequestParams("single", "value");

第三种是将参数写入一个Map中,然后将Map赋给RequestParams,例如:

HashMap paramMap = new HashMap();

paramMap.put("key", "value");

RequestParams params = new RequestParams(paramMap);

这三种方式无论哪一种都可以实现封装请求参数。

实现文件上传

使用Asynchttpclient实现文件上传也非常简单,我们先看一下代码:

RequestParams requestParams = new RequestParams();

File file = new File("/sdcard/okhttp-3.4.1.jar");

try {

requestParams.put("file", file);

AsyncHttpUtils.post(UrlUtils.UPLOAD_URL, requestParams, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

Log.i(TAG, getResources().getString(R.string.req_success));

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

Log.i(TAG, getResources().getString(R.string.req_failed));

}

});

} catch (FileNotFoundException e) {

e.printStackTrace();

}

可以看到,这里文件上传是将文件封装到RequestParams中的,Asynchttpclient框架提供的封装文件到RequestParams中有三种方法,分别是:

第一种是将文件转成流的形式封装到RequestParams中,例如:

InputStream myInputStream = blah;

RequestParams params = new RequestParams();

params.put("secret_passwords", myInputStream, "passwords.txt");

第二种就是像上面的代码一样,将文件直接封装到RequestParams中

第三种是将文件转成二进制数组的形式,例如:

byte[] myByteArray = blah;

RequestParams params = new RequestParams();

params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

这三种方法无论哪一种都可以实现封装文件到RequestParams中,然后调用AsyncHttpClient对象中的方法实现上传,具体使用哪一种看个人喜欢了。

实现文件下载

使用Asynchttpclient框架实现文件下载也非常简单,我们先看一下代码:

AsyncHttpUtils.download(UrlUtils.DOWNLOAD_URL, null, new FileAsyncHttpResponseHandler(getActivity()) {

@Override

public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {

Log.i(TAG, getResources().getString(R.string.req_failed));

}

@Override

public void onSuccess(int statusCode, Header[] headers, File file) {

Log.i(TAG, getResources().getString(R.string.req_success));

}

});

实现文件下载,回调选择的就是FileAsyncHttpResponseHandler这个Asynchttpclient框架提供的类,这可以非常方便的实现文件的下载。

关于Asynchttpclient框架就简单介绍到这里了,还有保存Cookie这个功能没有实现,不过实现也非常简单,不懂得可以看一下官方的文档,官网地址上文中有给出了。

最后,欢迎留言交流学习!

android http最新框架,Android框架学习笔记02AndroidAsycHttp框架相关推荐

  1. 26Play框架教程2学习笔记

    Play框架教程2学习笔记 文章目录 1 play框架01 1.1 概述 1.2 特性 1.2.1 无缝集成现有开发环境 1.2.2 热重载和修改Bug 1.2.3 简单的无状态MVC架构 1.2.4 ...

  2. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...

  3. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)

    一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...

  4. 开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)

    开源鸿蒙南向嵌入学习笔记--NAPI框架学习(一) 前言--系列介绍 本系列文章主要是记录笔者在鸿蒙南向的学习与工作中的知识点笔记记录,其中不止会针对鸿蒙中的学习问题进行思考与记录,也会对涉及到的一些 ...

  5. 免费学习机器学习和深度学习的源码、学习笔记和框架分享

    机器学习和深度学习的免费学习源码.学习笔记和框架分享 python笔记 源码 python导入模块的的几种方式 在python中,字典按值排序 python中set的基本常用方法 python取出fr ...

  6. 26Play框架教程1学习笔记

    Play框架教程1学习笔记 文章目录 1play教程 第一课 1.1 play是什么 1.2 REST风格是什么 1.3 play的优点和缺点 2 play教程 第二课 2.1 搭建开发环境 2.1. ...

  7. 史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)

    本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群. 对测试人来说,Appium 是非常重要的一个开源跨平台自动化测试工具,它允许测试人员在不同的平台(iOS.Android 等)使用同一套 API ...

  8. Android 《第一行代码》学习笔记

    目录 第一章 准备工作 一.Android 系统架构 二.Android 开发特点 1.四大组件 2.系统控件丰富 3.SQLite数据库 4.多媒体功能强大 5.地理位置定位 三.日志工具的使用 第 ...

  9. android如何适配,Android适配全攻略(学习笔记总结)

    Android适配全攻略(学习笔记总结) 一.为什么要进行屏幕适配 某厂商统计如下数据 2012年,支持Android的设备共有3997种 2013年,支持Android的设备共有11868种 201 ...

最新文章

  1. A Grain of Sand 一粒沙子
  2. AttributeError:module“seaborn” has no attribute “lineplot”
  3. 如何在windows7和windows8双系统中卸载windows8
  4. ms17-010 php版本,那年MS17-010
  5. Druid-基本概念
  6. String与string的区别
  7. Mysql 函数入门
  8. Android连续点击多次事件的实现
  9. shl性格测试_德勤2021秋招网申Tips+SHL笔试原题
  10. ExtJS Panel主要配置列表
  11. 路飞学城-Python开发集训-第2章
  12. [转载] pandas将Series变成键值对
  13. 数据科学 IPython 笔记本 一、TensorFlow
  14. 父子齐上阵,一起“闹天宫”
  15. 自动驾驶过冬,需要点燃“降本增效”的炉火
  16. 尸体火化,世界上再也找不到第二个比我社死的人了
  17. 如何把D盘多余空间返还给C盘
  18. Quality-Estimation1 (翻译质量评价-复现 WMT2018 阿里论文结果)
  19. JSONObject.parseObject()
  20. Dota2世界冠军OG被AI碾压,全程人类只推掉两座外塔 | 广东省智能创新协会

热门文章

  1. end to end testing
  2. 洛谷 U3357 C2-走楼梯
  3. Linux 共享内存详解一
  4. 标题在上边框中的html(fieldset标签)
  5. IOS应用开发版本控制工具之Versions使用,iosversions
  6. 【Android车载系统 News | Tech 1】News 谷歌开发车载Android系统 2014-12-19
  7. 安装Orchard错误
  8. Delphi纯代码连SQLite数据库,同时支持数据库的加密解密
  9. 数据备份、pymysql模块
  10. Qtum量子链漏洞赏金计划正式开启