为什么使用Volley

Android提供了两个HTTP库给开发者来进行实现一个HTTP请求,一个是AndroidHttpClient (从apache HttpClient拓展而来),另一个是HttpUrlConnection。两者都互有优缺点。当我们开发一个应用,一般来说,我们会写一些Http连接类,这些类可以处理所有Http请求,创建后台线程,管理线程池,解析response,缓存response,处理异常状态码、SSL连接,实现并行或者串行请求。每一个开发者都有自己的方式去实现这些方法。有些人可能会用AsycnTask在后台完成网络请求,有些人可能经过处理程序从UI线程创建HTTP连接类,然后在工作线程执行网络操作,再使用处理程序解析HTTP response返回主线程。

但是我们最终会重复编写相同的样板代码,我们试图在我们的应用程序重复造轮子。

例如,下面的代码片段,在AysncTask的doBackground 里实现一个HTTP请求。当我们获取response,把数据从HttpUrlConnection的输入流拷贝到输出流,然后把输出流再转化成我们最终想要的JsonObject。所有这些样板代码在我们的代码中重复出现。

HttpURLConnection urlConnection = null;
try {
URL url = new URL("http://www.android.com/");
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; // Adjust if you want
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
JSONObject resultJSON = new JSONObject(outputStream.toString()); }catch (Exception e) {
e.printStackTrace();
} finally {
urlConnection.disconnect();
}

所以谷歌提出volley,帮助开发人员处理相关的所有网络操作,这样开发人员可以集中精力实现HTTP响应后的业务逻辑。从而可以更少的网络代码调用,这样可以帮助开发者减少bug数量。

注意Volley在大文件操作中并不很适用,如上传/下载,这些case,还需要使用原始的方法

以下是Volley的一些关键特性:

为Android提供更快的网络请求

在后台线程中调度、并行实现所有HTTP请求并管理这些线程

提供灵活的方法来同步并发运行你的网络请求

带有内置的Json解析器

可以设置请求的优先级

为某些情况提供重试策略,如超时,内部服务器错误

可以很灵活的取消请求

提供图片的内存和磁盘缓存,批量处理下载

可以很灵活的实现自己的缓存

可以实现自己的HTTPStack(处理SSL连接,PATCH请求)

请求可以跟踪调试

可以和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

集成Volley项目

从git资源库Clone Volley项目:

git clone https://android.googlesource.com/platform/frameworks/volley

可以通过两种方式集成

生成Volley.jar,放到libs目录

把volley项目作为一个library依赖

使用Volley主要涉及连个类RequestQueue 和Request

RequestQueue ---调度请求队列并在工作线程执行请求,然后响应给主线程

Request---所有的网络请求都可以通过此类来创建,它提供了一个HTTP请求所需的主要参数,譬如:

请求类型-GET,POST,PUT,DELETE

URL

请求数据(HTTP Body)

成功响应监听

错误监听

简单使用

初始化RequestQueue

JsonObjectRequest

StringRequest

GsonRequest

当然你也可以自定义Request,使得其可以返回对应的Java类型。譬如,我们可以用Gson来自定义一个Request。

使用的时候和StringRequest和JsonObjectRequest差不多

最新文章

  1. 传统IT企业与互联网企业的一点思考
  2. php转化IP为整形
  3. USER STORIES AND USE CASES - DON’T USE BOTH
  4. vim c++补全
  5. hdu 2031 杨辉三角
  6. A-frame_02
  7. C#线程间通讯
  8. 使用ajax发送邮件的实例
  9. wlcore: firmware chunk too long
  10. MyBatis框架原理(三)
  11. error C2664: “UINT GetDriveTypeW(LPCWSTR)”: 无法将参数 1 从“char [5]”转换为“LPCWSTR”
  12. 网页meta标签总结
  13. crontab的两大坑:百分号和环境变量
  14. Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令
  15. 浅谈final关键字的用法
  16. 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree
  17. String.format(String format, Object... args)方法详解
  18. BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
  19. ubuntu16下Elasticsearch5.1.1安装部署
  20. AsyncTask、HandlerThread、IntentService和线程池

热门文章

  1. nightwatch.js - scroll until element is visible
  2. VC++的project文件
  3. 关于提高沟通能力的书单 | 章鱼书单zz
  4. 详谈kubernetes更新-2
  5. IMDB-WIKI - 具有年龄和性别标签的500k +脸部图像
  6. eclipse 导入web项目时常见错误
  7. java 定义一个同步map内存去重法
  8. asp识别手机端
  9. mvn 添加本地jar包
  10. asp.net 列表控件