上一篇博文中提到了自己写一个网络工具类,然而自己的能力明显有限,封装的工具类无论从功能还是性能上都比不上前辈大牛们已经完善好的网络框架,但是我们又想更加方便的使用大牛们的框架,怎么办呢?我们可以二次封装一下网上的网络框架,让它们使用起来更加的方便,这里以目前很流行的Volley为例:
直接使用Volley的Get请求时的步骤:
1.首先要创建一个全局的Volley队列,我们可以写一个MyApplication类继承Application,在该类的onCreate方法中创建队列。
2.在Activity中通过Volley的Get请求获取参数。
3.请求完成后给请求增加Tag,并加入到Volley队列中。
4.在Activity的onStop()方法中删除队列中的请求
代码如下:
Myapplication.java:
/**
* Created by 95 on 2015/10/14.
*/
public class MyApplication extends Application {
/**
* 先创建一个请求队列,因为这个队列是全局的,所以在Application中声明这个队列
*/
public static RequestQueue queues;
@Override
public void onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getQueues() {
return queues;
}
}
MainActivity.java:
private void Volley_Get() {
String url = Codes.ROOT_URL;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.i("请求成功");
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("请求失败");
}
});
request.setTag("login_Get");
MyApplication.getQueues().add(request);
}
MainActivity.java:
@Override
protected void onStop() {
super.onStop();
//删除队列中的请求
MyApplication.getQueues().cancelAll("lesson_Post");
}
步骤2的JsonObjectRequest()方法中的第一个参数是请求的模式(GET,POST),第二个参数是是url地址,第三个参数在GET模式下用不到,直接填null,后两个参数分别是成功和失败时的回调。
下面再来看看直接使用Volley的Post请求时的代码:
MainActivity.java:
private void Volley_Post() {
String url = Codes.ROOT_URL + "/lesson/index.api?";
//有两种添加params的方式:1.复写getParams方法,在StringRequest对象后面加一个{getparams(){..}}
//2.直接添加在JsonObjectRequest的Object参数中,方法如下:
/*
Map hashMap = new HashMap;
hashMap.put(..)
..
JSONObject object = new JSONObect(hashMap);
*/
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.i(MainActivity.this.getClass().getSimpleName(), "result>>" + jsonObject);
lesson = new Gson().fromJson(jsonObject + "", new TypeToken>() {
}.getType());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}) {
@Override
protected Map getParams() throws AuthFailureError {
Map hashMap = new HashMap();
hashMap.put("sort", 3 + "");
return hashMap;
}
};
request.setTag("lesson_Post");
MyApplication.getQueues().add(request);
}
看到这里大家应该有个感觉,那就是每次请求数据都要给请求添加标签以及加入到队列中,使用完毕后还要从队列中清除请求太麻烦了,所以我们可以对Volley进行二次封装,先上代码:
抽象类VolleyInterface.java:
/**
* 二次封装的好处:提高全局控制性,如果有要修改的地方,只需要改接口一个地方就好了
*/
public abstract class VolleyInterface {
private Context context;
public Response.Listener listener;
public Response.ErrorListener errorListener;
public VolleyInterface(Context context) {
this.context = context;
}
public abstract void onMySuccess(String result);
public abstract void onMyError(VolleyError error);
public Response.Listener loadingListener() {
listener = new Response.Listener() {
@Override
public void onResponse(String s) {
onMySuccess(s);
}
};
return listener;
}
public Response.ErrorListener errorListener() {
errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
onMyError(volleyError);
}
};
return errorListener;
}
}
VolleyRequest.java:
public class VolleyRequest {
public static StringRequest request;
private Context context;
public static void RequestGet(Context context, String url, String tag,VolleyInterface vif) {
MyApplication.getQueues().cancelAll(tag);
request = new StringRequest(Request.Method.GET, url,vif.loadingListener(),vif.errorListener());
request.setTag(tag);
MyApplication.getQueues().add(request);
MyApplication.getQueues().start();
}
public static void RequestPost(Context context, String url, String tag, final Map params,VolleyInterface vif) {
MyApplication.getQueues().cancelAll(tag);
request = new StringRequest(Request.Method.POST, url,vif.loadingListener(),vif.errorListener()){
@Override
protected Map getParams() throws AuthFailureError {
return params;
}
};
request.setTag(tag);
MyApplication.getQueues().add(request);
MyApplication.getQueues().start();
}
}
private void Volley_Package() {
String url = Codes.ROOT_URL;
VolleyRequest.RequestGet(this, url, "Volley_package", new VolleyInterface(this) {
@Override
public void onMySuccess(String result) {
Toast.makeText(MainActivity.this, "result=" + result, Toast.LENGTH_SHORT).show();
}
@Override
public void onMyError(VolleyError error) {
}
});
}
首先我们写一个类VolleyRequest.java,在该类中写两个方法分别对应get请求和post请求,大部分操作都和之前直接使用Volley框架类似,唯一的区别在于我们不可能在封装类中实现成功和失败后的回调(即JsonObjectRequest构造方法的最后两个参数)。所以我们写一个抽象类VolleyInterface.java,在这个抽象类中写两个方法获取成功回调和失败回调:loadingListener和errorListener,并在这两个方法中分别对成功回调和失败回调进行初始化,实现回调的抽象方法。然后在VolleyInterface.java中定义两个抽象方法:onMySuccess(),onMyError()。把这两个抽象方法放入已实现的回调方法中。ok,现在回到封装类VolleyRequest.java中,在最后两个参数处调用VolleyInterface.java的获取成功回调和获取失败回调的两个方法,因为这两个回调已经实现,所以不需要在封装类中实现回调了。通过这种方式,我们依然还是在Activity中实现回调的具体操作,并且极大的简化了使用时的代码量。
ok,二次封装Volley完成。