1. Volley简单介绍

我们平时在开发Android应用的时候不可避免地都须要用到网络技术。而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,差点儿在不论什么项目的代码中我们都能看到这两个类的身影,使用率很高。

只是HttpURLConnection和HttpClient的使用方法还是略微有些复杂的。假设不进行适当封装的话。非常easy就会写出不少反复代码。于是乎,一些Android网络通信框架也就应运而生,比方说AsyncHttpClient,它把HTTP所有的通信细节所有封装在了内部,我们仅仅须要简单调用几行代码就能够完毕通信操作了。再比方Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单。开发人员不用关心怎样从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley但是说是把AsyncHttpClient和Universal-Image-Loader的长处集于了一身,既能够像AsyncHttpClient一样很easy地进行HTTP通信。也能够像Universal-Image-Loader一样轻松载入网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整。它的设计目标就是很适合去进行数据量不大。但通信频繁的网络操作。而对于大数据量的网络操作。比方说下载文件等,Volley的表现就会很糟糕。

这是Volley名称的由来: a burst or emission of many things or a large amount at once

在Google IO的演讲上。其配图是一幅发射火弓箭的图,有点类似流星。见下图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

事实上,从这幅图,我们也能够看出来,Volley特别适合数据量不大可是通信频繁的场景。

2. 下载Volley

介绍了这么多理论的东西。以下我们就准备開始进行实战了,首先须要将Volley的jar包准备好。假设你的电脑上装有Git。能够使用例如以下命令下载Volley的源代码:

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

下载完毕后将它导入到你的Eclipseproject里,然后再导出一个jar包就能够了。

新建一个Android项目,将volley.jar文件拷贝到libs文件夹下,这样准备工作就算是做好了。

3. StringRequest的使用方法

前面已经说过。Volley的使用方法很easy,那么我们就从最主要的HTTP通信開始学习吧。即发起一条HTTP请求,然后接收HTTP响应。首先须要获取到一个RequestQueue对象,能够调用例如以下方法获取到:

[java] view
plain
copy

 
  1. RequestQueue mQueue = Volley.newRequestQueue(context);

注意这里拿到的RequestQueue是一个请求队列对象,它能够缓存全部的HTTP请求,然后依照一定的算法并发地发出这些请求。

RequestQueue内部的设计就是很合适高并发的。因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是很浪费资源的。基本上在每个须要和网络交互的Activity中创建一个RequestQueue对象就足够了。

接下来为了要发出一条HTTP请求,我们还须要创建一个StringRequest对象,例如以下所看到的:

[java] view
plain
copy

 
  1. StringRequest stringRequest = new StringRequest("http://www.baidu.com",
  2. new Response.Listener<String>() {
  3. @Override
  4. public void onResponse(String response) {
  5. Log.d("TAG", response);
  6. }
  7. }, new Response.ErrorListener() {
  8. @Override
  9. public void onErrorResponse(VolleyError error) {
  10. Log.e("TAG", error.getMessage(), error);
  11. }
  12. });

能够看到。这里new出了一个StringRequest对象,StringRequest的构造函数须要传入三个參数,第一个參数就是目标server的URL地址,第二个參数是server响应成功的回调,第三个參数是server响应失败的回调。当中。目标server地址我们填写的是百度的首页。然后在响应成功的回调里打印出server返回的内容。在响应失败的回调里打印出失败的具体信息。

最后。将这个StringRequest对象加入到RequestQueue里面并開始就能够了,例如以下所看到的:

[java] view
plain
copy

 
  1. mQueue.add(stringRequest);
  2. mQueue.start();

另外,因为Volley是要訪问网络的。因此不要忘记在你的AndroidManifest.xml中加入例如以下权限:

[java] view
plain
copy

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

好了。就是这么简单,假设你如今执行一下程序,并发出这样一条HTTP请求。就会看到LogCat中会打印出例如以下图所看到的的数据。

没错,百度返回给我们的就是这样一长串的HTML代码。尽管我们看起来会有些吃力。可是浏览器却能够轻松地对这段HTML代码进行解析,然后将百度的首页展现出来。

这种话,一个最主要的HTTP发送与响应的功能就完毕了。你会发现根本还没写几行代码就轻易实现了这个功能,主要就是进行了下面三步操作:

1. 创建一个RequestQueue对象。

2. 创建一个StringRequest对象。

3. 将StringRequest对象加入到RequestQueue里面。

只是大家都知道,HTTP的请求类型通常有两种,GET和POST。刚才我们使用的明显是一个GET请求,那么假设想要发出一条POST请求应该怎么做呢?StringRequest中还提供了第二种四个參数的构造函数。当中第一个參数就是指定请求类型的。我们能够使用例如以下方式进行指定:

[java] view
plain
copy

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

但是这仅仅是指定了HTTP请求方式是POST。那么我们要提交给server的參数又该怎么设置呢?非常遗憾。StringRequest中并没有提供设置POST參数的方法,但是当发出POST请求的时候。Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST參数。那么解决方法自然也就有了,我们仅仅须要在StringRequest的匿名类中重写getParams()方法。在这里设置POST參数就能够了。代码例如以下所看到的:

[java] view
plain
copy

 
  1. StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {
  2. @Override
  3. protected Map<String, String> getParams() throws AuthFailureError {
  4. Map<String, String> map = new HashMap<String, String>();
  5. map.put("params1", "value1");
  6. map.put("params2", "value2");
  7. return map;
  8. }
  9. };

你可能会说。每次都这样用起来岂不是非常累?连个设置POST參数的方法都没有。

可是不要忘记,Volley是开源的,仅仅要你愿意,你能够自由地在里面加入和改动不论什么的方法。轻松就能定制出一个属于你自己的Volley版本号。

4. JsonRequest的使用方法

学完了最主要的StringRequest的使用方法。我们再来进阶学习一下JsonRequest的使用方法。类似于StringRequest。JsonRequest也是继承自Request类的,只是因为JsonRequest是一个抽象类,因此我们无法直接创建它的实例。那么仅仅能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的差别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

至于它们的使用方法也基本上没有什么特殊之处。先new出一个JsonObjectRequest对象,例如以下所看到的:

[java] view
plain
copy

 
  1. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
  2. new Response.Listener<JSONObject>() {
  3. @Override
  4. public void onResponse(JSONObject response) {
  5. Log.d("TAG", response.toString());
  6. }
  7. }, new Response.ErrorListener() {
  8. @Override
  9. public void onErrorResponse(VolleyError error) {
  10. Log.e("TAG", error.getMessage(), error);
  11. }
  12. });

能够看到,这里我们填写的URL地址是http://m.weather.com.cn/data/101010100.html,这是中国天气网提供的一个查询天气信息的接口,响应的数据就是以JSON格式返回的。然后我们在onResponse()方法中将返回的数据打印出来。

最后再将这个JsonObjectRequest对象加入到RequestQueue里就能够了。例如以下所看到的:

[java] view
plain
copy

 
  1. mQueue.add(jsonObjectRequest);

这样当HTTP通信完毕之后,server响应的天气信息就会回调到onResponse()方法中,并打印出来。

如今执行一下程序。发出这样一条HTTP请求,就会看到LogCat中会打印出例如以下图所看到的的数据。

由此能够看出。server返回给我们的数据确实是JSON格式的,而且onResponse()方法中携带的參数也正是一个JSONObject对象。之后仅仅须要从JSONObject对象取出我们想要得到的那部分数据就能够了。

你应该发现了吧,JsonObjectRequest的使用方法和StringRequest的使用方法基本上是全然一样的。Volley的易用之处也在这里体现出来了,会了一种就能够让你举一反三。因此关于JsonArrayRequest的使用方法相信已经不须要我再去解说了吧。

好了,以下说一下实际中会出现的情况:

假设在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候。假设Activity被结束了,则我们须要写例如以下代码作为防守:

@Override
public void onPostExecute(Result r) {
if (getActivity() == null) {
return;
}
// ...
}

Activity被终止之后,假设继续使用当中的Context等,除了无辜的浪费CPU。电池,网络等资源。有可能还会导致程序crash,所以,我们须要处理这样的一场情况。

使用Volley的话。我们能够在Activity停止的时候。同一时候取消全部或部分未完毕的网络请求。

Volley里全部的请求结果会返回给主进程,假设在主进程里取消了某些请求,则这些请求将不会被返回给主线程。

比方,能够针对某些个request做取消操作:

  1. @Override
  2. public void onStop() {
  3. for (Request <?> req : mInFlightRequests) {
  4. req.cancel();
  5. }
  6. ...
  7. }

或者。取消这个队列里的全部请求:

[java] view
plain
copy

  1. @Override pubic void onStop() {
  2. mRequestQueue.cancelAll(this);
  3. ...
  4. }

也能够依据RequestFilter或者Tag来终止某些请求:

[java] view
plain
copy

  1. @Override public void onStop() {
  2. mRequestQueue.cancelAll( new RequestFilter() {})
  3. ...
  4. // or
  5. mRequestQueue.cancelAll(new Object());

Volley应该是简化了网络通信的一些开发。特别是针对例如以下两种情况:

  • JSON对象
  • 图片载入

可是这个东西也有不有用的地方,比方大数据(large payloads ),流媒体。这些case,还须要使用原始的方法,比方Download Manager等。

总之,假设你要编写网络程序,是不是能够考虑開始使用Volley呢?

Android框架之网络开发框架Volley的更多相关文章

  1. 2. Android框架和工具之 Volley

    Java基础知识强化之网络编程笔记23:Android网络通信之 Volley(Google开源网络通信库)

  2. Android框架之高速开发框架xUtil

    做Android开发我们通常是从原生态的開始,就是调用默认那些Android代码来开发我们的应用,可是到了一定程度,我们就想着怎么来高速开发我们的应用.这个时候我们就要着手来研究框架了. 以下介绍一个 ...

  3. 安卓中自定义并使用Volley框架请求网络

    大家好,今天我们讲一下如何使用Volley框架请求网络,为何要使用Volley框架,这就要先说一下使用Volley框架请求网络的优点了,volley是易于定制的,即你可以根据需求来设定volley框架 ...

  4. Android框架-Volley(一)

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  5. Android应用开发:网络工具——Volley(一)

    引言 网络一直是我个人的盲点,前一阵子抽空学习了一下Volley网络工具的用法,也透过源代码进行了进一步的学习,有一些心得想分享出来.在Android开发中,成熟的网络工具不少,Android自带了H ...

  6. Android应用开发:网络工具——Volley(二)

    引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequ ...

  7. 转载自安卓巴士 【收藏】2015必须推荐的Android框架,猿必读系列!

    一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...

  8. 2015推荐的Android框架

    一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...

  9. 2015必须推荐的Android框架,猿必读系列!

    一.Guava Google 的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency librarie ...

随机推荐

  1. Cocoapod错误 - Xcode6.4

    当我从Xcode 6.3切换到Xcode6.4的时候,因为我是mac上安装了两个不同的版本,现在把Xcode 6.3卸掉了. 现在再次运行pod install命令的时候,提示如下错误:   Upda ...

  2. 《Linux命令行大全》系列(二、导航)

    文件系统的导航,是一个不断访问树形结构中节点的过程. 文件系统树 Linux只有一个倒立的文件系统树 不同设备可以挂载到这同一个树上 文件和子目录是此树的组成部分,最顶层的即根目录 目录 根据树节点间 ...

  3. WEB SSH之Shellinabox

    用起来方便的,参考URL: http://lzw.me/a/shellinabox.html 生成 pem 证书,可以 https 方式启动.pem 证书的格式为公钥加私钥,并以 x509 的格式进行 ...

  4. 公告: 新博客已经迁移到 www.root.run

    root.run www.root.run www.root.run/sitemap.html www.root.run/sitemap.xml

  5. nyist 740 “炫舞家“ST(动态规划)

    dp[i][j][k]:表示第i次踩踏后两脚的位置j,k 先固定一只脚的位置j,第i次踩踏后,状态为dp[i][j][a[i]]或者dp[i][a[i]][j],其中a[i]表示第i个输入的元素,则有 ...

  6. op论坛,分支

    http://www.arm9home.net/thread.php?fid=68 http://www.openwrt.org.cn/bbs/forum.php https://dev.openwr ...

  7. WordPress Woopra plugin remote PHP arbitrary code execution exploit.

    测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! # Exploit Title: woopra plugins execute arbitrary PHP code E ...

  8. 【转】 Android SDK无法更新解决方法---不错

    原文网址:http://blog.csdn.net/shi_weihappy/article/details/41847997 自己的修改: 203.208.39.238 dl.google.com7 ...

  9. jquery方法详解--bind(type, [data], fn)

    转自:http://www.zhufengpeixun.cn/jquery/bind_type_data_fn.html bind(type, [data], fn)  返回值::jQuery 概述 ...

  10. [转]NHibernate之旅(5):探索Insert, Update, Delete操作

    本节内容 操作数据概述 1.新建对象 2.删除对象 3.更新对象 4.保存更新对象 结语 操作数据概述 我们常常所说的一个工作单元,通常是执行1个或多个操作,对这些操作要么提交要么放弃/回滚.想想使用 ...