Volley封装get请求和post请求
public interface NetListener {
//参数 就是解析后的数据
void successListener(T response );
//参数 对错误信息进行操作
void errorListener(VolleyError error);
}
/**
* 这个请求可以直接将数据进行解析,所以可以直接使用请求后的数据
*/
public class GsonRequest<T> extends Request<T> {
private Gson mGson;
private Response.Listener mListener;
private Class mClass;
//这是用于post请求的map
private HashMap map;
//用于get请求
public GsonRequest(int method, String url, Response.ErrorListener listener, Response.Listener listener1, Class aClass) {
super(method, url, listener);
mListener = listener1;
mClass = aClass;
mGson = new Gson();
}
//这是用于post接口数据的请求
public GsonRequest(int method, String url, Response.ErrorListener listener, Response.Listener listener1, Class aClass, HashMap map) {
super(method, url, listener);
mGson = new Gson();
mListener = listener1;
mClass = aClass;
this.map = map;
}
//请求网络数据
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
try {
//这是我们请求下来的数据
String data = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
//我们直接将请求好的数据写在请求成功的方法之中
//第一参数是解析好的的数据
//第二参数是缓存类
return Response.success(mGson.fromJson(data, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
//这是网络请求失败的返回结果
return Response.error(new ParseError(e));
}
}
@Override
protected Map getParams() throws AuthFailureError {
return map;
}
//分发事件
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
//数据缓存
@Override
public void deliverError(VolleyError error) {
//判断 如果没有网络连接 这时我们要使用缓存数据
if(error instanceof NoConnectionError){
Log.d("GsonRequest", "我是缓存的数据");
//获取缓存数据
Cache.Entry entry = this.getCacheEntry();
//创建请求 请求的数据就是我们自己缓存的数据
Response response = parseNetworkResponse
(new NetworkResponse(entry.data,entry.responseHeaders));
deliverResponse(response.result);
}
super.deliverError(error);
}
}
public class NetHelper {
private RequestQueue mRequestQueue;
private static NetHelper ourInstance = new NetHelper();
//在单例模式中我们对外提供了一个方法来获取对象
public static NetHelper getInstance() {
return ourInstance;
}
//为什么要把构造方法私有化?
//不想让别人创建出对象,所以私有化 我们只使用对外提供的方法获取本类的对象
private NetHelper() {
getRequestQueue();
}
//双重校验锁
private RequestQueue getRequestQueue(){
//第一个判断是用于提高代码效率的
//如果多个地方使用了这个单例,那么第一层判断就可以直接创建队列,
// 不为空的情况就直接返回队列
if (mRequestQueue == null){
//加锁 保证线程不会拥挤阻塞
synchronized (NetHelper.class){
//如果队列为空 创建我们自己的队列
if (mRequestQueue == null){
mRequestQueue = Volley.newRequestQueue(MyApp.getmContext());
}
}
}
return mRequestQueue;
}
/************************私有化的方法************************************/
//这是最最基本的请求方式
private void baseRequest(Request request){
mRequestQueue.add(request);
}
private void baseGsonRequest(String url , Class mClass, final NetListener listener){
GsonRequest gsonRequest = new GsonRequest(Request.Method.GET, url, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.errorListener(error);
}
}, new Response.Listener() {
@Override
public void onResponse(T response) {
listener.successListener(response);
}
},mClass);
mRequestQueue.add(gsonRequest);
}
private void baseGsonPostRequest(String url, Class mClass,final NetListener listener, HashMap map){
GsonRequest gsonRequest = new GsonRequest(Request.Method.POST, url, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.errorListener(error);
}
}, new Response.Listener() {
@Override
public void onResponse(T response) {
listener.successListener(response);
}
},mClass,map);
mRequestQueue.add(gsonRequest);
}
private void baseStringRequest(String url, final NetListener listener){
StringRequest stringRequest = new StringRequest(url, new Response.Listener() {
@Override
public void onResponse(String response) {
listener.successListener(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.errorListener(error);
}
});
mRequestQueue.add(stringRequest);
}
/******************对外提供的方法************************************/
public static void MySRequest(String url,NetListener listener){
getInstance().baseStringRequest(url,listener);
}
public static void MyRequest(String url,Class mClass,NetListener listener){
getInstance().baseGsonRequest(url,mClass,listener);
}
public static void MyRequest(String url,Class mClass,NetListener listener,HashMap map){
getInstance().baseGsonPostRequest(url,mClass,listener,map);
}
}
//get请求用法
NetHelper.MyRequest(url,实体类.class,定义的请求回调)
//post请求用法
HashMap<String,String> map = new HashMap<>();
map.put(key,value);
NetHelper.MyRequest(url,实体类.class,定义的请求回调);