android开发:对Volley进行二次封装
volley是目前最流行的android 网络通信框架之一,volley的好处和使用方法在这里就不详述,本文讲的是如何对volley进行二次封装。
- 先看一个使用volley的简单例子
import java.util.HashMap;
import java.util.Map;
import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.Request.Method;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.android.wangcl.comm.Constant;
import com.android.wangcl.R;
import android.os.Bundle;
public class DemoActivity extends BaseActivity {
private RequestQueue requestQueue;
private Map<String, String> map;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = Volley.newRequestQueue(this);
linkNet();
}
private void linkNet() {
map = new HashMap<String, String>();
// 登陆
Listener<String> listener = new Listener<String>() {
@Override
public void onResponse(String response) {
//TODO 解析json(先将response转为JsonObject或者JsonArray),所以说数据处理都将在这里进行
}
};
ErrorListener error = new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO 错误处理
}
};
StringRequest request = new StringRequest(Method.POST,
Constant.SERVICE_URL, listener, error) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//传入参数列表,用这种方式传参数可以避免汉字乱码等问题
map.put("username", "smilth");
map.put("password", "sersgsdf");
return map;
}
};
requestQueue.add(request);
}
}
以上代码大家可以看到,返回的json(也可以用其他方式返回数据)解析都在activity中进行。而且当activity需要进行多个不同的网络通讯时,当前方法并不能重复使用,必须重写一个几乎是一样的方法。所以对volley进行二次封装,意味着实现低耦合,并且让你的代码看起来更加优(sao)雅(bao)。
1.监视器
在android开发中,Activity要做的就是拿到数据,并展示出来,这是activity的核心业务逻辑。activity需要的是对象(bean),所以除了这个其他都可以剥离出来。首先我们需要一个监听器(interface) 把bean回调回来。
public interface OnDataCallBackListener<T> {
void onDataCallBack(T t);
void onError(String errorCode,String errorMessage);
}
2.StringRequest
抽出StringRequest(当然也可以用JsonRequest)
import java.util.Map;
import com.android.volley.AuthFailureError;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.StringRequest;
public class VolleyRequest extends StringRequest {
private Map<String, String> params;
public VolleyRequest(int method, String url, Listener<String> listener,
ErrorListener errorListener,Map<String, String> params) {
super(method, url, listener, errorListener);
this.params = params;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
}
3.Controller
核心层,网络请求和数据解析都将在这一层进行,该类为抽象类,让每个子类可以解析出不同的bean。
a.父类
import java.util.Map;
import android.content.Context;
import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
public abstract class VolleyNetHelper<T> implements Listener<String>, ErrorListener {
private Context context;
private RequestQueue requestQueue;//网络请求队列
public VolleyNetHelper() {
super();
}
public VolleyNetHelper(Context context) {
this.context = context;
}
public VolleyNetHelper(RequestQueue requestQueue,Context context) {
this.context = context;
this.requestQueue = requestQueue;
}
/**
* GET方式的访问请求
* @param url
* @param params
* @return
*/
public NetWorkRequest getRequestForGet(String url,Map<String, String> params){
return new NetWorkRequest(Method.GET,url,this,this,params);
}
/**
* POST方式的访问请求
* @param url
* @param params
* @return
*/
public NetWorkRequest getRequestForPost(String url,Map<String, String> params){
return new NetWorkRequest(Method.POST,url,this,this,params);
}
/**
* 发送get请求
* @param url
* @param params
*/
public void sendGetRequest(String url,Map<String, String> params){
requestQueue.add(getRequestForGet(url, params));
}
/**
* 发送post请求
* @param url
* @param params
*/
public void sendPostRequest(String url,Map<String, String> params){
requestQueue.add(getRequestForPost(url, params));
}
@Override
public void onResponse(String response) {
// TODO Auto-generated method stub
disposeReponse(response);//解析json,留给子类来做
}
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
disposeError(error);//处理错误
}
private UIDataListener<T> dataListener;//监视器
public void setDataListener(UIDataListener<T> dataListener) {
this.dataListener = dataListener;
}
public void notifyDataChanged(T t){
if(dataListener!=null)dataListener.onDataCallBack(t);//得到并处理bean,留给activity来做
}
public void notifyErrorHappened(String errorCode, String errorMessage){
if(dataListener!=null)dataListener.onError(errorCode, errorMessage);
}
public abstract void disposeReponse(String str);
public abstract void disposeError(VolleyError error);
}
b.子类
import android.content.Context;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
public class FatherNetHelper extends NetWorkHelper<Object> {
private Context context;
private Object obj;
public FatherNetHelper(Context context) {
super(context);
}
public FatherNetHelper(RequestQueue requestQueue,Context context,Object object) {
super(requestQueue,context);
this.obj = object;
}
@Override
public void disposeReponse(String str) {
//TODO str转为jsonObject,再处理json得到bean
}
@Override
public void disposeError(VolleyError error) {
// TODO Auto-generated method stub
}
}
4.Activity
import java.util.HashMap;
import java.util.Map;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.android.wangcl.ui.vo.UserVO;
import com.android.wangcl.ui.volley.NetWorkHelper;
import com.android.wangcl.ui.volley.SingleNetWorkHelper;
import com.android.wangcl.ui.volley.UIDataListener;
import com.android.wangcl.R;
import android.os.Bundle;
public class VolleyActivity extends BaseActivity implements UIDataListener<Object>{
private Map<String, String> map;
private NetWorkHelper<Object> netWorkHelper;
private RequestQueue requestQueue;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = Volley.newRequestQueue(this);
}
@Override
protected void onResume() {
super.onResume();
linkNet();
}
private void linkNet() {
map = new HashMap<String, String>();
// 登陆
map.put("username", "smilth");
map.put("password", "sersgsdf");
netWorkHelper = new SingleNetWorkHelper(requestQueue,this,UserVO.class);
netWorkHelper.sendPostRequest("http://www.....", map);
netWorkHelper.setDataListener(this);
};
@Override
public void onDataCallBack(Object obj) {
/**
* 可以通过Bean的类名对比,得到想要的bean,不需要重写方法
*/
if(obj.getClass()==UserVO.class){
//TODO 得到了bean
}
}
@Override
public void onError(String errorCode, String errorMessage) {
// TODO Auto-generated method stub
}
}
本文是我在CSDN第一篇bolg,也不是全部原创,但是链接一时找不到就没有放。一直相对volley进行二次封装,网上这方面的blog不多,之前看到一篇,觉得作者的思路非常好。今天在开发的时候决定实际操作一遍,借鉴了前文博客的方法,确实在解耦和代码优化方面提高了一个层次。也希望得到高手的指教,对后来者有所帮助。