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不多,之前看到一篇,觉得作者的思路非常好。今天在开发的时候决定实际操作一遍,借鉴了前文博客的方法,确实在解耦和代码优化方面提高了一个层次。也希望得到高手的指教,对后来者有所帮助。
相关文章推荐
- [置顶] android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP
- android开发,volley的二次封装和使用
- Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)
- android volley解析与二次封装
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包括处理请求队列和图片缓存))
- 单例模式,实现httpclient的封装,让android开发中,进行网络操作的时候更方便一点。
- Android开发笔记-使用Volley开源库进行Http网络请求(POST方式)
- Android Volley二次封装
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
- 【FastDev4Android框架开发】Volley完全解析之进阶最佳实践与二次封装(二十七)
- android框架搭建——二次封装Volley框架
- Android 网络通信框架Volley的二次封装
- Android网络请求Retrofit进行二次封装,拿过来就能用
- Android 完美对BaseAdapter进行二次封装
- Android开发,使用Volley框架进行简单数据交互
- 单例模式,实现httpclient的封装,让android开发中,进行网络操作的时候更方便一点。
- solidworks二次开发:在装配体中,对选择的零件进行配合装配
- AutoCAD进行二次开发
- 利用C#进行AutoCAD的二次开发(二)
- 利用C#进行AutoCAD的二次开发(二) by C#才鸟