让网络请求简单点——Volley框架(中)

简单点,说话的方式简单点……(《演员》薛之谦)

这篇博客是在我们熟知了Volley框架一些基本功能之后,进行对Volley的自定义的做法。

当我们阅读一些优秀的开源代码的时候我们可以发现,大部分的Activitty页面都会使用网络请求,现在我们学习了这个Volley框架,对网络请求有了很大的改进,代码也得更加简洁。

下面我们可以想象一下这样一个编程情景,我们在写一个Demo的时候,我们在Demo的各个Actiivty中都使用了Volley网络请求,下面我需要在网络请求失败的时候有一个Toast提示用户网络请求失败,那我就需要在Volley的请求失败的监听事件里添加Toast,上文我们说到我们写了好多的网络请求,我们就需要在各个Activity里添加Toast,这就尴尬了,何况我们还需要修改提示方式。解决方法就是我们对Volley的网络请求进行一个二次封装,这篇Volley(中)就是写一下对网络请求的二次封装!

那么我们开始!

1.新建类VolleyRequest

我们新建一个VolleyRequest类,代码如下:

public class VolleyRequest {

public static StringRequest stringRequest;
public static Context context;

public static void RequestGet(Context mContext, String url, String tag) {

    MyApplication.getHttpQueue().cancelAll(tag);// 把具有tag便签的请求全部取消,防止进行重复的请求消耗内存
    stringRequest = new StringRequest(Method.GET, url, listener(),
            errorListener());
    stringRequest.setTag(tag);
    MyApplication.getHttpQueue().add(stringRequest);
    MyApplication.getHttpQueue().start();

}

public static void RequestPost(Context mContext, String url, String tag,
        final Map<String, String> params) {

    MyApplication.getHttpQueue().cancelAll(tag);
    stringRequest = new StringRequest(url, listener(), errorListener()) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return params;
        }

    };
    stringRequest.setTag(tag);
    MyApplication.getHttpQueue().add(stringRequest);
    MyApplication.getHttpQueue().start();

}    }

我们创建了两个方法RequestGet()和RequestPost()分别对应StringRequest的get请求和post请求,我们首先想到的是需要给这两个方法传参数,一个是上下文环境Context,然后是url,然后是我们需要设置的Tag标签,在post请求的方法中我们还需要传一个url的请求参数,至于请求成功和请求失败的监听事件我们先放一放。
在RequestGet()方法内部我们需要先用cancelAll()方法,把具有tag便签的请求全部取消,防止进行重复的请求消耗内存。然后我们实例化StringRequest,同样监听事件先用默认值,然后给StringRequest对象设置标签,然后我们用add()方法将请求添加到请求队列,然后用start()方法,启动一下请求。
RequestPost()方法内部与RequestGet()类似,唯一不同是我们需要用到getParams()方法来传递参数。接下来我们需要看一下监听事件如何处理了。

2.请求成功和请求失败的接口的回调

我们要编写的这个接口需要涵盖请求成功和请求失败,所以我们新建抽象类VolleyInterface,代码如下:

public abstract class VolleyInterface {

public static Context mContext;
public static Listener<String> mListener;
public static ErrorListener mErrorListener;

public VolleyInterface(Context context, Listener<String> listener,
        ErrorListener errorListener) {

    this.mContext = context;
    this.mListener = listener;
    this.mErrorListener = errorListener;
}

public abstract void onMySuccess(String result);

public abstract void onMyError(VolleyError error);

public Listener<String> loadingListener() {

    mListener = new Listener<String>() {

        @Override
        public void onResponse(String response) {
            onMySuccess(response);
        }
    };
    return mListener;

}

public ErrorListener errorListener() {

    mErrorListener = new ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            onMyError(error);
        }
    };
    return mErrorListener;

}}

首先我们新建两个监听事件Listener和ErrorListener的对象,然后我们创建构造方法将参数实例化。
然后我们新建返回监听事件的方法loadingListener()和errorListener(),然后在方法内部实例化监听事件的对象,为了能够调用这两个方法,我们需要编写两个抽象方法onMySuccess()和onMyError()。好了,我们的抽象方法就编写好了,接下来,我们将接口放到VolleyReques()方法中,代码如下:

public class VolleyRequest {

public static StringRequest stringRequest;
public static Context context;

public static void RequestGet(Context mContext, String url, String tag,
        VolleyInterface vif) {

    MyApplication.getHttpQueue().cancelAll(tag);// 把具有tag便签的请求全部取消,防止进行重复的请求消耗内存
    stringRequest = new StringRequest(Method.GET, url,
            vif.loadingListener(), vif.errorListener());
    stringRequest.setTag(tag);
    MyApplication.getHttpQueue().add(stringRequest);
    MyApplication.getHttpQueue().start();

}

public static void RequestPost(Context mContext, String url, String tag,
        final Map<String, String> params, VolleyInterface vif) {

    MyApplication.getHttpQueue().cancelAll(tag);
    stringRequest = new StringRequest(url, vif.loadingListener(),
            vif.errorListener()) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return params;
        }

    };
    stringRequest.setTag(tag);
    MyApplication.getHttpQueue().add(stringRequest);
    MyApplication.getHttpQueue().start();

} }

这样,我们把监听事件接口作为参数就可以使用啦!

3.在Activity中使用

使用时与二次封装之前类似,代码如下:

String url = "http://v.juhe.cn/weather/index?cityname=济南&dtype=&format=&key=40fc62ea2c3256efa4e43effda53b3f0";
    VolleyRequest.RequestGet(this, url, "abcGet", new VolleyInterface(this,
            VolleyInterface.mListener, VolleyInterface.mErrorListener) {

        @Override
        public void onMySuccess(String result) {
            Log.e("MainActivity_onMySuccess", result);
        }

        @Override
        public void onMyError(VolleyError error) {
            Log.e("MainActivity_onMyError", error.toString());
        }
    });

运行软件,我们就可以在控制台看到打印的Json数据了,简单到爆炸有没有!

回到刚开始说到的问题,现在我们使请求成功时弹出Toast,要如何操作呢?我们只需要在抽象类VolleyInterface的loadingListener()方法内部编写一个Toast就可以了,代码如下:
public Listener<String> loadingListener() {

    mListener = new Listener<String>() {

        @Override
        public void onResponse(String response) {
            onMySuccess(response);
            Toast.makeText(mContext, "请求成功!", Toast.LENGTH_SHORT).show();
        }
    };
    return mListener;

}
这样我们就不用在每次请求都写一个Toast了!
好的,关于Volley网络请求的二次封装就介绍到这里了!接下来发表的Volley框架(下),我们会学习一下用Volley框架请求、缓存图片的功能,敬请关注!

袁程序猿的CSDN博客:安卓学习心得


往期回顾:
让网络请求简单点——Volley框架(上)
让你的电脑变成windows+安卓双系统
安卓四大组件——ContentProvider
SQLite详解
小程序发布,你方了吗?
安卓四大组件——Service(服务)
安卓四大组件——BroadcastReceiver(广播)
搞懂 res ->values + res ->drawable : 资源
界面美化 —— 布局
Intent——把两个Activity关联起来!
常用控件
关于Activity的生命周期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值