您的位置:首页 > 移动开发 > Android开发

android开发:对Volley进行二次封装

2015-04-09 15:15 651 查看

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第一篇bol
8d3e
g,也不是全部原创,但是链接一时找不到就没有放。一直相对volley进行二次封装,网上这方面的blog不多,之前看到一篇,觉得作者的思路非常好。今天在开发的时候决定实际操作一遍,借鉴了前文博客的方法,确实在解耦和代码优化方面提高了一个层次。也希望得到高手的指教,对后来者有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息