Android Volley学习

开发android应用不少时候都要涉及网络操做,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操做,但当应用比较复杂的时候须要咱们编写大量的代码处理不少东西:图像缓存,请求的调度等等;html

而Volley框架就是为解决这些而生的,它与2013Google I/O大会上被提出:使得Android应用网络操做更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专一与产生RESTful Request。另外,Volley在不一样的线程上异步执行全部请求而避免了阻塞主线程。java

Volley到底有哪些特色android

  1. 自动调度网络请求git

  2. 多个并发的网络链接github

  3. 经过使用标准的HTTP缓存机制保持磁盘和内存响应的一致算法

  4. 支持请求优先级json

  5. 支持取消请求的强大API,能够取消单个请求或多个数组

  6. 易于定制缓存

  7. 健壮性:便于正确的更新UI和获取数据服务器

  8. 包含调试和追踪工具

地址:

git clone https://android.googlesource.com/platform/frameworks/volley 或者 https://github.com/mcxiaoke/android-volley 

或者到Maven下载http://central.maven.org/maven2/com/mcxiaoke/volley/library/1.0.19/library-1.0.19.jar

StringRequest的用法

前面已经说过,Volley的用法很是简单,那么咱们就从最基本的HTTP通讯开始学习吧,即发起一条HTTP请求,而后接收HTTP响应。首先须要获取到一个RequestQueue对象,能够调用以下方法获取到:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

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

注意这里拿到的RequestQueue是一个请求队列对象,它能够缓存全部的HTTP请求,而后按照必定的算法并发地发出这些请求。RequestQueue内部的设计就是很是合适高并发的,所以咱们没必要为每一次HTTP请求都建立一个RequestQueue对象,这是很是浪费资源的,基本上在每个须要和网络交互的Activity中建立一个RequestQueue对象就足够了。

 

接下来为了要发出一条HTTP请求,咱们还须要建立一个StringRequest对象,以下所示:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

  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的构造函数须要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址咱们填写的是百度的首页,而后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。

 

最后,将这个StringRequest对象添加到RequestQueue里面就能够了,以下所示:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

  1. mQueue.add(stringRequest);  

另外,因为Volley是要访问网络的,所以不要忘记在你的AndroidManifest.xml中添加以下权限:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

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

运行以后就得百度首页的html的代码

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

1. 建立一个RequestQueue对象。

2. 建立一个StringRequest对象。

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

不过你们都知道,HTTP的请求类型一般有两种,GET和POST,刚才咱们使用的明显是一个GET请求,那么若是想要发出一条POST请求应该怎么作呢?StringRequest中还提供了另一种四个参数的构造函数,其中第一个参数就是指定请求类型的,咱们可使用以下方式进行指定:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

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

但是这只是指定了HTTP请求方式是POST,那么咱们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并无提供设置POST参数的方法,可是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法天然也就有了,咱们只须要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就能够了,代码以下所示:

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

  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版本。

JsonRequest的用法

学完了最基本的StringRequest的用法,咱们再来进阶学习一下JsonRequest的用法。相似于StringRequest,JsonRequest也是继承自Request类的,不过因为JsonRequest是一个抽象类,所以咱们没法直接建立它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

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

[java] view plaincopy在CODE上查看代码片派生到个人代码片

 

  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 plaincopy在CODE上查看代码片派生到个人代码片

 

  1. mQueue.add(jsonObjectRequest);  

这样当HTTP通讯完成以后,服务器响应的天气信息就会回调到onResponse()方法中,并打印出来。如今运行一下程序,发出这样一条HTTP请求,就会看到LogCat中会打印出以下图所示的数据。

 

由此能够看出,服务器返回给咱们的数据确实是JSON格式的,而且onResponse()方法中携带的参数也正是一个JSONObject对象,以后只须要从JSONObject对象取出咱们想要获得的那部分数据就能够了。

你应该发现了吧,JsonObjectRequest的用法和StringRequest的用法基本上是彻底同样的,Volley的易用之处也在这里体现出来了,会了一种就可让你触类旁通,所以关于JsonArrayRequest的用法相信已经不须要我再去讲解了吧。

好了,关于Volley的基本用法就讲到这里,下篇文章中我会带领你们继续探究Volley。

相关文章
相关标签/搜索