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

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不多,之前看到一篇,觉得作者的思路非常好。今天在开发的时候决定实际操作一遍,借鉴了前文博客的方法,确实在解耦和代码优化方面提高了一个层次。也希望得到高手的指教,对后来者有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值