这是一张经典的图片。 Volley的中文翻译是“齐射、并发”,也就是说Volley特别适合数据量不大但通信频繁的场景。不支持发布大数据,不适合上传文件。本文主要介绍Volley的常见用法,共五类,StringRequest, JsonRequest ,ImageRequest, ImageLoader, NetWorkImageView。准备工作:需要添加的参考库
编译“com.mcxiaoke.volley:library:1.0.19”所需的请求链接
淘宝商品搜索建议:https://suggest.taobao.com/sug?code=utf-8q=商品名称所需权限
一、StringRequest的用法
StringRequest,字面意思理解为String请求,请求的结果是一个字符串。这个怎么用,先看构造方法。
/**
/**
* 使用给定方法创建一个新请求。
*
* @param method 请求{@link Method}使用
* @param url 获取字符串的URL
* @param Listener 接收字符串响应的监听器
* @param errorListener 错误侦听器,或null 忽略错误
*/
公共StringRequest(int 方法, String url, Listenerlistener,
错误监听器错误监听器){
超级(方法,网址,错误监听器);
mListener=监听者;
}
/**
* 创建一个新的GET 请求。
*
* @param url 获取字符串的URL
* @param Listener 接收字符串响应的监听器
* @param errorListener 错误侦听器,或null 以忽略错误
*/
公共StringRequest(字符串url, Listenerlistener, ErrorListener errorListener) {
this(Method.GET, url, 监听器, errorListener);
总共有两个。第一个构造函数有四个参数,可以指定请求类型。第二个构造函数有三个参数,默认为GET 请求。现在我们尝试发起一个请求,代码可以这样写。
RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);
mQueue.add(getStringRequest());构建消息队列RequestQueue。什么是请求队列?以下是RequestQueue的类注解
/**
* 带有调度程序线程池的请求调度队列。
*
* 调用{@link #add(Request)} 会将给定的请求排入队列进行调度,
* 从工作线程上的缓存或网络解析,然后交付
* 主线程上已解析的响应。
*/大致意思是:一个带有线程池的请求调度队列,调用add方法会调度指定的请求,从一个工作线程(工作时使用的线程,即子线程)解析缓存或网络,然后在主线程上提供解析响应。
好的,明确告诉我们需要一个请求,然后添加。我们先来做一个简单的Get请求。
公共StringRequest getStringRequest() {
return new StringRequest("https://suggest.taobao.com/sug?code=utf-8q=beizi",
新的Response.Listener() {
@覆盖
公共无效onResponse(字符串响应){
Log.e(getClass().getName(),响应);
}
},
新的Response.ErrorListener() {
@覆盖
公共无效onErrorResponse(VolleyError错误){
Log.e(getClass().getName(),error.getMessage());
}
}
);第一个参数是请求的链接地址,第二个参数是正确的回调,第三个参数是错误的回调。
打印结果:
E/test.volley.com.volley.MainActivity$2: {"结果":[["杯子","5198589"],["被子","5508160"],["被子冬天被子","1657880"], ["陶瓷杯","887481"],["玻璃杯","964491"],["带盖陶瓷杯","360083"],["被芯","1835894"],["杯子创意","1946812"],["杯子保温杯","1615177"],["被子被子芯冬季被子","1436705"]]}上面是GET请求,现在使用前四个参数尝试POST请求的构造函数,
公共StringRequest(int 方法, String url, Listenerlistener, ErrorListener errorListener) {
超级(方法,网址,错误监听器); mListener=监听者;
构造中不能传递post参数,怎么办?不用大惊小怪,基本上所有的网络框架,参数都是在结构体中传递的。它必须被封装。查看StringRequest的父类Request,有很多与请求配置相关的方法,其中之一就是getParams。
/**
* 返回用于POST 或PUT 请求的参数映射。可以扔
* {@link AuthFailureError} 因为可能需要身份验证才能提供这些值。
*
*请注意,您可以直接重写{@link #getBody()} 来获取自定义数据。
*
* @throws AuthFailureError 如果身份验证失败
*/
protected MapgetParams() 抛出AuthFailureError {
返回空值;
}所以,有一个办法,重写StringRequest中的父类getParams方法,在getParams中返回我们自己的map。所以上面的Request改成这样
公共StringRequest getPostStringRequest() {
return new StringRequest(Request.Method.POST,"https://suggest.taobao.com/sug?code=utf-8q=beizi",
新的Response.Listener() {
@覆盖
公共无效onResponse(字符串响应){
Log.e(getClass().getName(),响应);
}
},
新的Response.ErrorListener() {
@覆盖
公共无效onErrorResponse(VolleyError错误){
Log.e(getClass().getName(),error.getMessage());
}
}
){
@覆盖
protected MapgetParams() 抛出AuthFailureError {
MapparamMap=new HashMap();
paramMap.put("param1","value1");
paramMap.put("param2","value3");
返回参数映射;
}
};
}总结一下步骤:
步骤1:构建RequestQueue 步骤2:构建合适的请求步骤3:将步骤2 中的请求添加到RequestQueue
StringRequest就是这么简单,但是我们更常用的是JsonRequest
二、JsonRequest的用法
。话不多说,让我们直接上代码。
私人无效dispatcherJsonObjectRequest(){
Volley.newRequestQueue(getApplicationContext()).add(new JsonObjectRequest(Request.Method.POST, "https://suggest.taobao.com/sug?code=utf-8q=diannao",
新的Response.Listener() {
@覆盖
公共无效onResponse(JSONObject响应){
Log.e(getClass().getName(),response.toString());
}
}, 新的Response.ErrorListener() {
@覆盖
公共无效onErrorResponse(VolleyError错误){
Log.e(getClass().getName(), error.getMessage());
}
}
));
}打印结果:
E/test.volley.com.volley.MainActivity$2: {"结果":[["电脑桌","3558727"],["电脑椅","1740042"],["电脑包","7051240"] ,["电脑主机","265635"],["电脑音箱","826213"],["电脑","23633255"],["电脑桌面之家","432711"],["电脑显示器" ,"401223"],["电脑耳机","577117"],["电脑椅之家","366804"]]} 对于JsonRequest请求,可以引入GSON等类似库来解析部分JSON字符串地方。
三、ImageRequest的用法
ImageRequest的构造函数如下
/**
* 创建一个新的图像请求,解码到最大指定宽度并
* 高度。如果宽度和高度都为零,则图像将被解码为
* 其自然尺寸。如果两者之一非零,则该维度将为
* 夹紧,另一个将设置为保留图像的纵横比
* 比率。如果宽度和高度都不为零,则图像将被解码为
* 适合尺寸为宽x 高的矩形,同时保持其
* 纵横比。
*
* @param url 图片的URL
* @param Listener 接收解码后的位图的监听器
* @param maxWidth 将此位图解码到的最大宽度,如果没有则为零
* @param maxHeight 将此位图解码到的最大高度,或者为零
* 没有任何
* @param scaleType 用于计算所需图像尺寸的ImageViews ScaleType。
* @paramdecodeConfig 将位图解码为的格式
* @param errorListener 错误侦听器,或null 以忽略错误
*/
公共ImageRequest(字符串url, Response.Listenerlistener, int maxWidth, int maxHeight,
ScaleTypescaleType, 配置decodeConfig, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
设置重试策略(
新的DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT));
mListener=监听者;
mDecodeConfig=解码配置;
m最大宽度=最大宽度;
mMaxHeight=最大高度;
mScaleType=缩放类型;
参数很多,一共有7个。第一个参数是图片的URL地址。第二个参数是图片请求成功的回调。第三个和第四个参数用于指定图像的最大宽度和高度。五个参数指定图像的缩放类型,第六个参数用于指定图像的颜色属性。这里可以使用Bitmap.Config下的几个常量,其中ARGB_8888可以显示每个图像像素的最佳颜色属性。占用4个字节大小,而RGB_565表示每个图像像素占用2个字节大小。第六个参数是图片请求失败时的回调。当请求失败时,ImageView 中会显示默认图像。其实我个人觉得这并不是一个好的设计。参数过多,不利于用户使用。使用此构造函数创建一个新的图像请求,解码为最大指定宽度和高度。如果宽度和高度都为零,则图像将被解码为其自身图片的大小。如果指定的网络图像的宽度或高度大于此处的最大值,则图像将被压缩。
私人无效dispatherImageRequest(){
Volley.newRequestQueue(getApplicationContext()).add(new ImageRequest("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png", new Response.Listener() {
@覆盖
公共无效onResponse(位图响应){
mImageView.setImageBitmap(响应);
}
},0,0, ImageView.ScaleType.CENTER, Bitmap.Config.ALPHA_8,new Response.ErrorListener() {
@覆盖
公共无效onErrorResponse(VolleyError错误){
mImageView.setImageResource(R.mipmap.ic_launcher);
}
}));
}
四、ImageLoader的用法
ImageLoader 内部也是使用ImageRequest 实现的。其构造函数可以传入一个ImageCache缓存参数来实现图像缓存功能。它还可以过滤重复的链接,以避免重复请求。
私有无效dispatherImageLoader() {
RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);
ImageLoader imageLoader=new ImageLoader(mQueue, new ImageLoader.ImageCache() {
int 最大尺寸=10 * 1024 * 1024;
私有LruCachemCache=新LruCache(maxSize) {
@覆盖
protected int sizeOf(字符串键, 位图位图) {
返回bitmap.getRowBytes() * bitmap.getHeight();
}
};
@覆盖
公共位图getBitmap(String url) {
返回mCache.get(url);
}
@覆盖
公共无效putBitmap(字符串url,位图位图){
mCache.put(url,位图);
}
});
imageLoader.get("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png", new ImageLoader.ImageListener() {
@覆盖
公共无效onResponse(ImageLoader.ImageContainer响应,布尔值isImmediate){
mImageView.setImageBitmap(response.getBitmap());
}
@覆盖
公共无效onErrorResponse(VolleyError错误){
mImageView.setImageResource(R.mipmap.ic_launcher);
}
});
与ImageRequest实现效果不同的是,当ImageLoader加载图片时,会先显示默认图片,等到图片加载完成后才显示在ImageView上。
5、NetworkImageView用法
NetworkImageView是一个自定义控件,继承自ImageView,封装了请求网络加载图片的功能。这个想法很好,在项目中经常可以使用,增强封装性。
添加到布局中
RequestQueue mQueue=Volley.newRequestQueue(MainActivity.this);
ImageLoader imageLoader=new ImageLoader(mQueue, new ImageLoader.ImageCache() {
int 最大尺寸=10 * 1024 * 1024;
私有LruCachemCache=新LruCache(maxSize) {
@覆盖
protected int sizeOf(字符串键, 位图位图) {
返回bitmap.getRowBytes() * bitmap.getHeight();
}
};
@覆盖
公共位图getBitmap(String url) {
返回mCache.get(url);
}
@覆盖
公共无效putBitmap(字符串url,位图位图){
mCache.put(url,位图);
}
});
mNetworkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【深入解析:网络库入门教程篇一】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
最近在学这方面的东西,这个系列博客看起来很有帮助!
有18位网友表示赞同!
终于有人整理了这些网络库的信息!之前总是有好多资料要自己筛选。
有5位网友表示赞同!
期待这个系列能介绍一些实用且比较流行的库。
有14位网友表示赞同!
我是前端小白,希望能够从这篇入门就学到一些东西。
有18位网友表示赞同!
不知道这篇文章会聊哪些类型的网络库呢?
有11位网友表示赞同!
最近想学习开发一些web应用,这些库应该很有用!
有7位网友表示赞同!
收藏 dulu, 以后学习的时候再来看。
有16位网友表示赞同!
"流行" 网络库指的是什么类型?我很想知道。
有19位网友表示赞同!
希望能介绍到比较详细的使用方法和教程,这样更容易上手。
有13位网友表示赞同!
我的技能有限,但我会尽力跟着这个系列学习新的东西!
有18位网友表示赞同!
希望博客能覆盖各个方面,包括性能、安全性等等.
有18位网友表示赞同!
这些网络库一般都会在哪个平台上使用?
有13位网友表示赞同!
学习完了这个系列后,我可以做些什么项目呢?
有5位网友表示赞同!
如果有案例代码讲解会更棒哦!
有6位网友表示赞同!
期待后续的文章能深入介绍一些热门的库。
有11位网友表示赞同!
感谢作者愿意分享这些知识,这样很对新手有帮助!
有6位网友表示赞同!
这个系列博客会不会发布在别的平台上?比如Github?
有7位网友表示赞同!
不知道这篇文章会针对哪一个编程语言的开发讲的?
有5位网友表示赞同!
希望能多一些互动环节,让我们可以和作者交流学习。
有16位网友表示赞同!
我很期待这篇博客能给我带来很多启发!
有10位网友表示赞同!