android http最新框架,Android框架学习笔记02AndroidAsycHttp框架

上一篇中我们介绍了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这个功能没有实现,不过实现也非常简单,不懂得可以看一下官方的文档,官网地址上文中有给出了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 读取app.config配置文件 节点键值,提示 配置系统未能初始化 错误的解决方案...

新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元…

miui12 android系统耗电,miui12耗电严重怎么办,miui12续航优化方法

很多小米用户反馈升级到miui12稳定版后耗电大大增加!再大的电池也经不住miui12的耗电!那么miui12耗电严重怎么办?miui12续航优化的方法呢?一起和XDA小编看看吧!近日,有网友对此提供了优化miui12耗电的方法&…

Linux下 执行程序

看到有人问Linux下的./表示什么意思,我就趁机在这里写一下个人愚见: ./的意思是执行当前目录下的某可执行文件. . /相当于 source 根目录下的一个脚本. 转载于:https://www.cnblogs.com/zuiyirenjian/p/4299322.html

r6400 usb android,网件R6400路由器USB接口速率测试与总结

网件R6400路由器USB接口速率测试测试中使用的是浦科特M6V 256GB固态硬盘搭配USB3.0硬盘盒进行测试,此外由于无线网络速率有一定的波动,对最终测试成绩测试成绩有较大的影响,因此我们使用网速相对稳定的千兆有线网络连接路由器进行测试。首先我…

只用2000行代码实现google protocol buffer c++版的功能

2019独角兽企业重金招聘Python工程师标准>>> google protocol buffer (下面简称gpb)功能强大,应用广泛,但在实际应用中,gpb需要写.proto脚本文件,需要依赖.lib库,还需要为每个消息体生成一大堆难以阅读的C代…

thinkphp 获取客户端ip地址方法

/*** 获取客户端IP地址* param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字* param boolean $adv 是否进行高级模式获取(有可能被伪装) * return mixed*/ function get_client_ip($type 0,$advfalse) {$type $type ? 1 : 0;stati…

android:layout 冒号,android-json解析及简单例子(补汉6个汉字字).pdf

android json 解析及简单例子JSON 的定义:一 种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的 支持),从而可以在不同平台间进行…

流控思路——多消费者定量生产(第100篇)

为什么80%的码农都做不了架构师?>>> 多线程消费队列到指定个数时触发一个生产线程往队列中补充元素,保证队列中有足够的数据供消费,不至于使消费线程等待,也不至于在队列中堆得过多。假设10人消费,先放2个…

Unicode(UTF-8, UTF-16)令人混淆的概念

Unicode(UTF-8, UTF-16)令人混淆的概念 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样.其他啥文字图片之类的其他东…

android优化最强软件,七款安卓手机优化软件推荐 为手机提速

启动项管理器设置七款安卓手机优化软件推荐 超频工具OverClock Widget希望提高手机运行速度,只是更改开机启动项是不够的,其实我们还可以通过超频让手机的运行速度飞起来。超频降频工具OverClock Widget是一款能对CPU进行超频或降频的桌面小部件&#xf…

UVA 10570 Meeting with Aliens

题意: N个外星人围成一桌坐下,有序的排列指N在N-1与N1中间,现在给出一个序列,问至少交换几次可以得到有序的序列。 分析: 复制一遍输入序列,放在原序列之后。相当于环。通过枚举,可以把最小交换…

【转】Android 4.3源码的下载和编译环境的安装及编译

原文网址:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html 告诉windows用户一个不好的消息,windows环境下没法编译android源码。用cygwin?不行,因为cygwin模拟的环境太简单,编译android源码需要好多工…

android关机分区卸载,Android关机重启流程(二)

一、回顾先回顾下上部分得分析,从最开始的PM.reboot(),经过层层调用,最终调用SystemProperties.set(“sys.powerctl”, “reboot,” reason);二、重启流程aosp/system/core/init/property_service.cppaosp/system/core/init/reboot.cppaosp/…

每天一道算法题(39)——含有重复字符的全排列

思路 (1)对于含有重复字符的全排列必须使用isSwap函数 (2)整体思路 a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下) b,子字符串位置后移(i1-----n)。递归处理子字符串 c,将a中的交换复原。 代码 #in…

android 初始化语言,Android Init Language(安卓初始化语言)

android源码学习目录了解Android init进程的都知道,启动 init进程之前会解析init.rc文件,init.rc是Android的配置文件脚本,它由一种被称为"Android初始化语言"--Android init Language 编写。1. android init language(简称 AIL)组…

使用JetBrains dotMemory 4.0分析内存

安装下载地址:http://www.jetbrains.com/profiler/ 1.在本地启动web应用后,打开dotMemory,附加进程 2.附加后会看到集中颜色得粗条,不断往左边走动,这是内存运行情况, 3.Get snapshot,抓取两次快照,等自动信…

AutoHomeRefreshListView仿汽车之家下拉刷新 《IT蓝豹》

2019独角兽企业重金招聘Python工程师标准>>> AutoHomeRefreshListView仿汽车之家下拉刷新 AutoHomeRefreshListView 高仿汽车之家下拉刷新 ,下拉的时候出现很不错的效果。本项目来自:https://github.com/nugongshou110/AutoHomeRefreshListVi…

html字体整体偏移,CSS自定义字体垂直偏移(错误?)

ScottS..5你可能没有做错任何事情.以下是一些可能适用的要点,有些可以由您控制,有些则不可以.只是为了确定,明确设置vertical-align: baseline.不同的文件(.eof,.woff,.ttf)本身可以不定义是相同的,并且因此不同的浏览器使用不同的文件并显示差异.不确定是否有两个src电话搞乱了…

随笔1

过来这几天身体一直不舒服,一直没有调整过来。转载于:https://www.cnblogs.com/zzyoucan/p/4314644.html

android pss内存,如何释放android系统中pss cache住的内存

通过dumpsys meminfo可以统计查看到android各进程内存使用情况:Total RAM: 463136 kBFree RAM: 170277 kB (48221 cached pss 68780 cached 53276 free)Used RAM: 173253 kB (152085 used pss 3160 buffers 176 shmem 17832 slab)Lost RAM: 119606 kBZRAM: 216…