使用过volley的小伙伴们都知道volley框架的强大之处,volley主要是用来处理数据量小,频率高的网络请求。以StringRequest为例,其基本使用方法如下。
1、创建请求队列
private RequestQueue rq;
rq= Volley.newRequestQueue(MainActivity.this);
2、创建请求对象并发送给请求队列
StringRequest sr=new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//请求成功
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//请求失败
}
});
rq.add(sr);//开始请求
发现问题:这种网络请求的方式虽然比Google原生的请求方式便捷很多,但是细心的你一定会发现使用volley进行网络请求的时候,每次都要写成功和失败时候的回调方法。失败时的回调方法每次都要写,对于访问失败的原因无非是网络环境不佳,通常情况下的处理方法就是弹出一个Toast提醒用户“网络连接失败,请稍后重试!”。对于这种重复而没有技术含量的工作我们应该是拒绝的,所以我们这次就要对volley框架进行一个简单的封装,来解决每次请求失败回调的问题。
解决思路:首先创建一个抽象类,通过这个抽象类来完成我们volley回调的功能,其中请求成功的回调每次不尽相同,所以我们将请求成功时的回调方法写成一个抽象方法在使用的时候进行实现,将不需要重写的方法写成实现的方法。
解决问题:
经过分析可以知道,其中请求成功的时候需要我们自己处理,请求失败的时候只需要指定一个模版,每次都调用相同的方法就可以了。因此创建一个抽象类,将需要每次处理的方法定义为抽象方法,用于每次调用的时候实现;不需要重写的部分写成实现的方法。
public abstract static class MyStringListener{
//请求成功的方法
public abstract void StringRequestOk(String response);
//请求失败的时候
public void StringRequstError(Context context){
Toast.makeText(context, "网络错误,请稍后再试", Toast.LENGTH_SHORT).show();
}
}
创建一个网络请求的方法,将以上抽象类对象应用在这个方法中去,以后每次网络请求就调用这个方法。
public static void startStringRequest(final Context mContext, RequestQueue rq, String url, final MyStringListener mListener){
StringRequest sr=new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//请求成功的时候使用重写的StringRequestOk方法
mListener.StringRequestOk(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//请求失败的时候调用StringResqustError方法
mListener.StringRequstError(mContext);
}
});
rq.add(sr);//开始请求
}
具体的使用方法如下
btn_sendRequest= (Button) findViewById(R.id.btn_sendRequest);
btn_sendRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
StringRequestUtils.startStringRequest(MainActivity.this,rq, url, new MyStringListener() {
@Override
public void StringRequestOk(String content) {
Log.e("content",content);
}
});
}
});
这样的写法只需要每次处理请求成功的回调即可,如果需要修改请求失败的回调,只需重写我们自定义的mystringlistener()方法中的失败回调方法即可,具体如下
btn_sendRequest= (Button) findViewById(R.id.btn_sendRequest);
btn_sendRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
StringRequestUtils.startStringRequest(MainActivity.this,rq, url, new MyStringListener() {
@Override
public void StringRequestOk(String content) {
Log.e("content",content);
}
@Override
public void StringRequstError(Context context) {
Toast.makeText(MainActivity.this, "我就是没网,你打我啊!!", Toast.LENGTH_SHORT).show();
}
});
}
});
至此对Volley简单的封装就完成了,简单回顾下简单的步骤
1、定义一个抽象的类,将需要每次回调的方法写成抽象的方法,用来让用户进行重写;不需要每次回调的方法直接实现。
2、调用volley正常的使用方式,在回调中调用我们自己抽象方法中的方法。
3、在网络请求中直接用自己封装的方法代替volley的原生使用方法。
第一次写博客,内容组织的比较混乱,各位看官凑合这看吧,希望能够在工作和生活中帮助到大家。