开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;
而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
Volley到底有哪些特点呢?
- 自动调度网络请求
- 多个并发的网络连接
- 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
- 支持请求优先级
- 支持取消请求的强大API,可以取消单个请求或多个
- 易于定制
- 健壮性:便于正确的更新UI和获取数据
- 包含调试和追踪工具
如何使用Volley
- 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
Volley中的RequestQueue 和 Request
RequestQueue
用来执行请求的请求队列Request
用来构造一个请求对象Request对象
主要有以下几种类型:
StringRequest
响应的主体为字符串JsonArrayRequest
发送和接收JSON数组JsonObjectRequest
发送和接收JSON对象ImageRequest
发送和接收Image
Volley的基本使用
首先我们需要创建一个RequestQueue requestQueue
,然后构建一个自己所需要的XXRequest req
,之后通过requestQueue.add(req)
;将请求添加至请求队列;
构建一个RequestQueue
RequestQueue requestQueue=Volley.newRequestQueue(this);//这里的this指的是Context
创建一个Request(以JsonObjectRequest为例)
private final String url="http:/xxxxx"//所需url JsonObjectRequest req=new JsonObjectRequest(url,null,new Response.Listener<JsonObject>(){ @Override public void onResponse(JsonObject response){ //添加自己的响应逻辑, } }, new ResponseError.Listener(){ @Override public void onResponseError(VollerError error){ //错误处理 L.d("Error Message:","Error is"+error); } });
将req添加到requestQueue
在构建JsonObjectRequest
对象时,需要四个参数,其中第二个参数代表http方法,第三个和第四个分别是响应监听和响应错误监听,分别需要覆写onResponse()
和onResponseError()
方法;RequestQueue
将会执行请求,并将响应回调onResponse()
方法,所以需要在onResponse()方法中实现自己的业务逻辑
此博文源码下载地址 https://github.com/Javen205/VolleyDemo.git
使用请求队列RequestQueue
Volley中的Request都需要添加到RequestQueue中才能执行,所以首先需要创建一个RequestQueue
RequestQueue = Volley.newRequestQueue(mContext);
通常情况在一个应用中需要统一管理一个请求队列,所以采用单例模式(注意:这不是必须的),创建一个类并在这个类中初始化RequestQueue
等核心对象,以及实现一些我们所需的方法;
代码如下:
package com.javen.volley; import android.content.Context; import android.text.TextUtils; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley; public class VolleyController { // 创建一个TAG,方便调试或Log private static final String TAG = "VolleyController"; // 创建一个全局的请求队列 private RequestQueue reqQueue; private ImageLoader imageLoader; // 创建一个static ApplicationController对象,便于全局访问 private static VolleyController mInstance; private Context mContext; private VolleyController(Context context) { mContext=context; } /** * 以下为需要我们自己封装的添加请求取消请求等方法 */ // 用于返回一个VolleyController单例 public static VolleyController getInstance(Context context) {