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

来源:互联网 发布:医疗器械软件研究文档 编辑:程序博客网 时间:2024/06/06 02:38

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

这篇博客是在我们熟知了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的生命周期

0 0
原创粉丝点击