一.概述
Volley是谷歌推荐的一个网络请求框架,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。今天来对Volley进行一个简单的封装,使用起来方便一点。
二.封装
1.VolleyUtil
public class VolleyUtil {
private static RequestQueue mRequestQueue;
/**
* 初始化请求队列,单例保证只有一个请求队列
* @param context
*/
public static void initialize(Context context){
if(mRequestQueue == null){
synchronized (VolleyUtil.class){
if(mRequestQueue == null){
mRequestQueue = Volley.newRequestQueue(context);
}
}
}
}
/**
* 获取请求队列
* @return
*/
public static RequestQueue getRequestQueue(){
if(mRequestQueue == null){
throw new RuntimeException("请先初始化RequestQueue");
}
return mRequestQueue;
}
}
2.GsonRequest(解析json数据)GET方式
public class GsonRequest<T> extends Request<T> {
private ResponseListener mListener;
private Gson mGson;
private Type mClazz;
public GsonRequest(String url, Type type , ResponseListener listener) {
super(Method.GET, url, listener);
mGson = new Gson();
mClazz = type;
mListener = listener;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
T result;
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
result = mGson.fromJson(jsonString,mClazz);
return Response.success(result,HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Response.error(new ParseError());
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
3.ResponseListener
//响应接口
public interface ResponseListener extends Response.Listener,Response.ErrorListener {
}
4.TestApi
public class TestApi {
public static void getObjectApi(String url, ResponseListener listener){
//创建请求
Request request = new GsonRequest(url,new TypeToken<MovieInfo>(){}.getType(),listener);
//将请求添加到请求队列
VolleyUtil.getRequestQueue().add(request);
}
}
上面封装的是GET请求,下面我们看看如何封装一个POST请求,相同的部分就不说了,下面给出改动的地方,
我们先给出接口地址
public static final String POST_POP_LIST =
"http://api.themoviedb.org/3/discover/movie?sort_by=vote_average.desc&api_key=643e503c35816202926457ad7d535052";
然后是GsonRequest
public class GsonRequest<T> extends Request<T> {
private ResponseListener mListener;
private Gson mGson;
private Type mClazz;
private HashMap<String,String> mParams;//封装请求参数
public GsonRequest(String url, Type type ,HashMap<String,String> params, ResponseListener listener) {
super(Method.POST, url, listener);
mGson = new Gson();
mClazz = type;
mParams = params;
mListener = listener;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
T result;
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
result = mGson.fromJson(jsonString,mClazz);
return Response.success(result,HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Response.error(new ParseError());
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
/**
* 在 Volley 的网络操作中,如果判断请求方式为 Post 则会通过此方法来获取 param,所以在这里返回我们需要的参数
* @return
* @throws AuthFailureError
*/
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return mParams;
}
}
最后是TestApi
public class TestApi {
public static void getObjectApi(String url, ResponseListener listener){
HashMap<String,String> params = new HashMap<>();
//封装参数
params.put("api_key", Constant.API_KEY);
Request request = new GsonRequest(url,new TypeToken<MovieInfo>(){}.getType(),params,listener);
VolleyUtil.getRequestQueue().add(request);
}
}