上篇文章简单的介绍了volley的使用,这篇偶将继续和大家一起分享volley的使用。
其实忘记一件很重要的事情,我相信也是很多初识volley的人困惑的地方,就是从哪里开始学习,认识volley,使用volley,可能你谷歌或者百度到的最多的就是一个简单demo或者对volley介绍的翻译,如果你很牛可能理解起来很容易,但是对于我等菜鸟还是有点难度的。虽然偶的水平有限,但是我会尽量遵照自己这段时间对volley的认识过程来总结。
1、volley的部署
上篇提到我们不会直接在Activiy中创建volley的请求队列对象,因为这个对象我们只要一个就够了。既然不这样那我们该怎么做呢,这里给一个建议。先上一张项目结构图:
思路是这样的:我们在application中对volley进行初始化。然后通过静态方法拿到这个对象,即可在所有地方使用,关键代码如下(来自:https://github.com/ogrebgr):
/**
* 这段代码来自这里:https://github.com/ogrebgr
*
* @author ttdevs
*/
public class VolleyQueue {
private static RequestQueue mRequestQueue;
private static ImageLoader mImageLoader;
private VolleyQueue() {
}
/**
* 初始化我们的请求队列。这个地方有一个BitmapLruCache,这个是在后面做图片加载的时候会提到的图片缓存策略
*
* @param context
*/
static void init(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
// Use 1/8th of the available memory for this memory cache.
int cacheSize = 1024 * 1024 * memClass / 8;
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(cacheSize));
}
public static RequestQueue getRequestQueue() {
if (mRequestQueue != null) {
return mRequestQueue;
} else {
throw new IllegalStateException("RequestQueue not initialized");
}
}
public static ImageLoader getImageLoader() {
if (mImageLoader != null) {
return mImageLoader;
} else {
throw new IllegalStateException("ImageLoader not initialized");
}
}
}
这样我们就可以在想要的地方随意使用了。
2、自定义请求
通过第一步拿到请求队列对象之后我们就可肆意的发请求了~~简单的GET请求我们之前已经展示过,下面要说的就是POST方式的请求和自定义自己的请求对象。在此之前,我们先来看一下volley源码的结构,这里也直接上两张图:
红线标注的部分我们看到了熟悉的StringRequest,这个就是我们之前使用的那个请求类。具体源码大家可以去先看一下,这样对下面的代码理解会有很大帮助。
当你简单查看上图的几个*****Request类之后你会发现他们有一个共同的特点:都是继承了Request类。这里先告诉大家,自定义请求类也是继承这个Request类的。我们照着StringRequest类可以得到一个下面的自定义请求类:
public class CustomReqeust extends Request<String> {
private final Listener<String> mListener;
public CustomReqeust(int method, String url, Listener<String> listener, ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void deliverResponse(String response) {
// TODO Auto-generated method stub
}
}
我们简单的分析下这几行代码。首先是构造函数,通过super我们发现,构造函数中我们需要提供三个参数,分别是:method、url、errorListener,它们的意思分别是:请求方式,即POST/GET;请求的URL;出错时的回调监听器。而StringRequest的构造函数中多了一个Listener<String> listener,这个通过前面的demo大家应该知道它是用来处理请求结果的,当然大部分情况我们是需要这个东西的,因此我们把它加上。这样就完整了。下面还有两个必须实现的方法,这个是干什么的呢?我们先来看看StringRequest中这两个方法的实现:
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
protected void deliverResponse(String response) {}
传递响应,通过我们初始化时候设置的成功监听器来传递HTTP响应结果。
protected Response<String> parseNetworkResponse(NetworkResponse response){}
通过名称我们猜测是解析网络响应,对StringRequest类源码分析我们大致得出结论它应该是根据HTTP头的编码解析HTTP包体。当我们处理特殊的或者自定义的HTTP请求时就可以在此处实现对HTTP包体进行解析。
说了这么多我们还是没有说到如何进行HTTP的POST请求,因为我们还没讲到如何设置POST方式的请求参数。
自习翻阅volley源码中的几个request类的子类,我们可以在JsonRequest类中发现如下代码:
/**
* Returns the raw POST or PUT body to be sent.
*
* @throws AuthFailureError in the event of auth failure
*/
@Override
public byte[] getBody() {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
对,你猜的没错,他就是处理我们请求参数的方法,在这里我们组织好要传的参数,然后转换成byte数组即可。这样我们就可以开始实现自己自定义的请求了。下面贴一个简单的完整例子供参考:
public class CustomReqeust extends Request<String> {
/** http请求编码方式 */
private static final String PROTOCOL_CHARSET = "utf-8";
private Listener<String> mListener;
private String mUserName;
public CustomReqeust(String url, String userName, Listener<String> listener, ErrorListener errorListener) {
super(Method.POST, url, errorListener);
mUserName = userName;
mListener = listener;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
@Override
public byte[] getBody() {
try {
return mUserName == null ? null : mUserName.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mUserName, PROTOCOL_CHARSET);
return null;
}
}
}
调用代码不想不贴,但是要用到,还是贴一下(这里的URL还是www.baidu.com):
private void customRequest() {
CustomReqeust request = new CustomReqeust(URL, "CustomVolley", new Listener<String>() {
@Override
public void onResponse(String arg0) {
Toast.makeText(getApplicationContext(), arg0, Toast.LENGTH_LONG).show();
Log.d("onResponse", arg0);
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
Toast.makeText(getApplicationContext(), arg0.toString(), Toast.LENGTH_LONG).show();
Log.d("onErrorResponse", arg0.toString());
}
});
mQueue.add(request);
}
由于没有测试服务器,因此就简单的抓包看一下,结果如下:
从图中可以看到,我们的请求时正确的。至此我们就完成了自定义请求的实现。
3、总结
可以自定义的地方远远不止这些,更多的HTTP请求参数大家可以从几个Request子类入手,如JsonRequest类中用到的设置ContentType类型,getRetryPolicy()等。当你了解了这些东西之后你会发现volley真的是高端大气上档次。当然还有很多细节没有讲到,比如取消一个请求,设置请求超时等等,这些细节如果在分析源码的时候遇到会和大家分享。有时间会接着和大家分享volley对图片的加载。从下一篇开始,和大家分享volley的整个架构。最后,有不当之处欢迎吐槽。
后记:
现在时间是1:01分,吐槽两句:代码不是一切,这么晚了还在敲代码还是越少越好,还有更重要的事情等着你。谨此Mark下可能将要失去的坚持了五年的恋爱。最后祝所有的单身程序猿都能找到自己的她……
分享到:
相关推荐
android-volley-master volley library。android开发之Google官方开源框架,著名的开源框架
google推出的android开源网络框架Volley,适合数据量较小但请求频繁的应用。压缩包包括了源码,范例和jar包
volley是一种android网络开源系统的一种框架,方便网络请求.
针对面试常问的几种开源框架的源码详解,EventBus/Retrofit/RxJava/Volley/okHttp/Binder机制等
本库是一款基于RxJava2 Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载进度显示,请求错误自动重试,请求携带...
一个非常好用的,谷歌官方推出的开源框架,对于网络请求和图片请求都封装的非常好。
(5) 验证框架(集成开源框架) (6) json解析(支持解析成集合或者对象) (7) 数据库(不知道是哪位写的 忘记了) (8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) (9) 自动更新模块 (10) 一...
本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载进度显示,请求错误自动重试,请求携带...
google volley code,开源请求框架类
2. 网络请求的排序(scheduling) ---------------------------------------------------- 3. 网络请求的优先级处理 ---------------------------------------------------- 4. 缓存 ------------------------------...
今天通过使用GitHub中的开源项目android-image-indicator来简单实现APP自带图片的轮播以及加载网络图片进行轮播。 一、从GitHub上下载项目 GitHub地址:https://github.com/panxw/android-image-indicator 其中介绍...
开源volley框架jar包(推荐大家一个Android开发交流群: 63452411 群内有挺多源码,欢迎大家加入)
Volley 是一个 HTTP 库,它能够帮助 Android app 更方便地执行网络操作,最重要的是,它更快速高效。我们可以通过开源的 AOSP 仓库获取到 Volley 。 Volley 有如下的优点: 自动调度网络请求。 高并发网络连接。 ...
以前原本都用android内建的Library来进行GET、POST等等对API的连线与操作。 但最近想说来找找看有没有好用的library,应该可以事半功倍。 当初有找了三套比较多人用的 1.Android Asynchronous Http Client 2.okhttp ...
集成了android-async-http, volley, okhttp3等网络请求框架.可直接切换底层库. 1 简介 架构分层 总共分为三层: 网络请求调用层. app统一调用该层接口和这层提供的回调,该层可以切换不同的网络请求库. 网络请求库...
volley是一个轻量级的开源网络通信框架,开源的好处就是可以自由定制自己需要的jar包。volley里网络通信时android2.3以上用的HttpUrlConnection,2.3以下用的HttpClient,我做的改动只考虑了2.3以上,不支持2.3版本...
Android Volley是Android平台上很好用的第三方开源网络通信框架。使用简单,功能强大。
这个demo 是根据Volley 后续开发的项目,熟悉使用Volley 框架,非常方便
(2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2、android-async-http 项目地址:...
Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎...