Android Volley 研究综述(一)

文章目录
  1. 1. Volley 的简介
  2. 2. Volley 的准备
  3. 3. StringRequest 的使用
  4. 4. JsonRequest 的使用
  5. 5. 参考文献

今天的生活是由三年前我们的选择决定的,而今天我们的抉择将决定我们三年后的生活。

Android 官网对 Volley 的一句话概括如下:

Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster.
即 Volley 是一个 HTTP 库,能让 Android apps 的网络操作更容易,并且最重要的是,更快捷。

Volley 的简介

Volley 于 2013 年 Google I/O 大会上推出,是一种新式的网络通信框架,具有以下优点:

  • 网络请求的自动调度。
  • 多并发网络连接。
  • 使用标准 HTTP 缓存连贯性来缓存透明的磁盘和内存响应。
  • 支持请求优先级。
  • 取消请求 API。你可以取消一个单一请求,或者你可以取消请求的某些区域。
  • 易于定制,例如,定制重试和回退功能。
  • 强大的指令,使得异步加载网络数据,且正确地显示到 UI 更加简单。
  • 调试与追踪工具。

Volley 擅长用来显示 UI 的 RPC (远程过程调用协议) 类型的操作,如获取作为构造性数据的一页搜索结果。它轻松地整合了任何协议,同时输出支持的数据,如原始的字符串,图片和 JSON。通过提供内置的支持你需要的特性,Volley 使你免于去写样板代码,让你将关注点放在你的 App 的功能逻辑上。

Volley 不适合大的数据文件的下载或者大数据量的操作,是由于 Volley 需要保持解析时内存里的所有响应。

以上简介来自官网,总的来说,Volley 既可以像 AsyncHttpClient 一样简单地进行 HTTP 通信,也可以像 Universal-Image-Loader 一样轻松地加载网络图片。Volley 非常适合进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,如下载文件,Volley 的表现就不敢恭维了。

Volley 的准备

首先,电脑上最好得装有 Git,具体安装方法因操作系统各异,自行 Google,推荐梯子蓝灯。好,下载 Volley 源码:

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

下载完成后,在 /volley/build/intermediates/bundles/debug 里找到 classes.jar,就是我们要的 jar 包了,拷贝一份出来,重命名成 volley.jar,再使用 Android Studio 新建一个 Android 项目,将 volley.jar 文件添加到 libs 目录下,如图:

然后,鼠标左击选中 volley.jar,再右击会出现一长串菜单,下拉找到 Add As Library 并单击,再 OK,等待 Gradle build。完事后,再选中项目,比如我的 VolleyDemo,右击后下拉菜单,找到 Open Module Settings 并单击,出现如图:

看到 Volley 已在 Dependencies 中,点击右下角 OK,完事,这样准备工作就完成了。

StringRequest 的使用

StringRequestDemo 地址: StringRequestDemo,只有 Get 请求的使用,Post 请求的使用,类比即可。

从最基本的 HTTP 通信开始学习,即发起一条 HTTP 请求,然后接收 HTTP 响应。Android Studio 新建一个StringRequestDemo 项目,其他全部默认,一路 Next 到底,最后 Done。思路如下:

首先,在 MainActivity 的 onCreate() 方法里,需要获取到一个 RequestQueue 对象:

1
RequestQueue queue = Volley.newRequestQueue(this);

这里的 RequestQueue 是一个请求队列对象,它可以缓存所有的 HTTP 请求,然后以一定的算法并发地发出这些请求。RequestQueue 内部的设计非常适合高并发,因此,不必为每一次的 HTTP 请求都创建一个 RequestQueue 对象,在每个需要和网络交互的 Activity 中创建一个 RequestQueue 对象基本足够。

其次,为了要发出一条 HTTP 请求,再创建一个 StringRequest 对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String url = "http://www.google.com";

StringRequest stringRequest = new StringRequest(url,
new Response.Listener<String>() {

@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});

这里 new 出一个 StringRequest 对象,StringRequest() 方法中传入了三个参数,第一个是目标服务器的 URL 地址,第二个是服务器响应成功的回调,第三个是服务器响应失败的回调。具体来说,目标服务器地址填的是 Google 的首页(需要翻墙),然后,在响应成功的回调里,打印出服务器返回的内容;在响应失败的回调里,打印出失败的详细信息。

最后,将该 StringRequest 对象添加到 RequestQueue 里面即可:

1
queue.add(stringRequest);

另外,Volley 要访问网络,在 AndroidManifest.xml 文件中添加一条权限:

1
<uses-permission android:name="android.permission.INTERNET"/>

运行程序,发出该 HTTP 请求,Logcat 中部分打印数据如下:

1
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en"><head><meta content="width=device-width,minimum-scale=1.0" name="viewport"><meta content="Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for." name="description"><meta content="noodp" name="robots"><meta content="/logos/doodles/2016/hertha-marks-ayrtons-162nd-birthday-6049205031272448-hp.jpg" itemprop="image"><link href="/images/branding/product/ico/googleg_lodp.ico" rel="shortcut icon"><meta content="Hertha Marks Ayrton&#8217;s 162nd birthday #GoogleDoodle" property="og:description"><meta content="http://www.google.com/logos/doodles/2016/hertha-marks-ayrtons-162nd-birthday-6049205031272448-thp.png" property="og:image"><meta content="500" property="og:image:width"><meta content="200" property="

Google 返回的就是这一长串 HTML 代码,浏览器可以轻松地将这段 HTML 代码解析,然后将 Google 首页展现出来。如此,最基本的 HTTP 发送与响应的功能就完成了。代码量不多,其实,主要分以下三步:

  • 创建一个 RequestQueue 对象。
  • 创建一个 StringRequest 对象。
  • 将 StringRequest 对象添加到 RequestQueue 里面。

以上,使用的只是 Get 请求,不过 HTTP 的请求类型通常有 Get 和 Post,要发出一条 Post 请求,则思路如下:

事实上,StringRequest 中也提供了一种四个参数的构造函数,其中第一个参数即指定了请求类型,如下:

1
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);

但是需要明确的是,StringRequest 中并没有提供设置 Post 参数的方法,然而,当发出 Post 请求时,Volley 会尝试调用 StringRequest 的父类即 Request 中的 getParams() 方法来获取 Post 参数,故只需要在 StringRequest 的匿名类中重写 getParams() 方法,于此设置 Post 参数即可,具体如下:

1
2
3
4
5
6
7
8
9
10
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {

@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};

虽然没有设置 Post 参数的方法,但是由于 Volley 开源,可以自由地添加和修改,定制出所需的 Volley 版本。

JsonRequest 的使用

JsonRequestDemo 地址: JsonRequestDemo,只有 JsonObjectRequest 的使用,JsonArrayObject 的使用,类比即可。

同 StringRequest 一样,JsonRequest 也是继承于 Request 类,但是,JsonRequest 是一个抽象类,无法直接创建实例,得从子类入手。其有两个直接的子类,JsonObjectRequest (用于请求一段 JSON 数据) 和 JsonArrayRequest (用于请求一段 JSON 数组) 。具体如下:

第一步同上述 StringRequest 的第一步一样。

然后,再 new 出一个 JsonObjectRequest 对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String url = "http://www.weather.com.cn/data/sk/101010100.html";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null,
new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});

最后,类比 StringRequest,将 JsonObjectRequest 对象添加到 RequestQueue 里面:

1
queue.add(jsonObjectRequest);

同时,不要忘了在 AndroidManifest.xml 文件中添加同上面一样的权限。

上面的 URL 地址是一个查询天气信息的接口,响应的数据是以 JSON 格式返回的,这样,HTTP 通信完成后,服务器响应的天气信息回调到 onResponse() 方法中,在 Logcat 中打印出数据如下:

1
{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"18","WD":"东南风","WS":"1级","SD":"17%","WSE":"1","time":"17:05","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暂无实况","qy":"1011","rain":"0"}}

如此,根据实际需求,从 JSONObject 对象中取出需要的数据即可。

总结来说,StringRequest, JsonObjectRequest 和 JsonArrayRequest 的用法基本一致,关于 Android Volley 研究综述(一)到此结束,(二)未完待续。

本人才疏学浅,如有疏漏错误之处,望读者中有识之士不吝赐教,谢谢。

1
Email: [email protected] / WeChat: Wolverine623

您也可以关注我个人的微信公众号码农六哥第一时间获得博客的更新通知,或后台留言与我交流

参考文献

1.http://developer.android.com/training/volley/index.html

2.http://developer.android.com/training/volley/request.html

3.http://blog.csdn.net/guolin_blog/article/details/17482095