让网络请求简单点——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的生命周期
- 让网络请求简单点——Volley框架(中)
- 让网络请求简单点——Volley框架(上)
- 让网络请求简单点——Volley框架(下)
- Android —— 网络请求框架 Volley
- Android网络请求框架:Volley简单使用
- android Volley请求框架的简单使用——访问网络和加载图片
- 网络请求框架---Volley
- Volley网络请求框架
- 网络请求框架---Volley
- 网络请求框架-Volley
- Volley-----网络请求框架
- Volley网络请求框架
- Volley网络请求框架
- Volley网络请求框架
- 对Volley简单的封装,让网络请求更简单
- Android网络通信请求框架——Volley
- Volley——网络请求框架的使用
- Volley—轻量级HTTP客户端网络请求框架
- 线性结构 1 两个有序链表序列的合并
- 解读 TiWorkerCoreInitialize
- Java容器----HashMap和HashSet的区别
- 【LeetCode】 70. Climbing Stairs
- BZOJ2713 [Violet 2]愚蠢的副官&BZOJ1183 [Croatian2008]Umnozak
- 让网络请求简单点——Volley框架(中)
- RNN上的BPTT的简单推导
- 498. Diagonal Traverse
- 自动执行 Nmap 扫描的工具 LazyMap
- 坚持写博客,留下我的足迹
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- 借用jython调用stanford parser
- selenium之自动选课脚本
- CMN_1022: [FreeTDS][SQL Server]The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION