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

    xiaoxiao2021-03-25  80

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

    这篇博客是在我们熟知了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框架请求、缓存图片的功能,敬请关注!


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


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

    转载请注明原文地址: https://ju.6miu.com/read-25307.html

    最新回复(0)