Volley用法全解析

来源:互联网 发布:overture打谱软件 编辑:程序博客网 时间:2024/05/16 17:15

100505176ee6982846_副本.jpg

前言

Volley想必很多人都用过,为了建立网络编程的知识体系,Volley是必须要讲的知识点,所以我这里有必要再次介绍一下Volley的使用。

1.Volley简介

在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。在使用Volley前请下载Volley库并放在libs目录下并add到工程中。 下载Volley请点击这

2.Volley网络请求队列

Volley请求网络都是基于请求队列的,开发者只要把请求放在请求队列中就可以了,请求队列会依次进行请求,一般情况下,一个应用程序如果网络请求没有特别频繁则完全可以只有一个请求队列(对应Application),如果非常多或其他情况,则可以是一个Activity对应一个网络请求队列,这就要看具体情况了,首先创建队列:

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());

3.StringRequest的用法

StringRequest返回的数据是String类型的,我们查看下StringRequest的源码:

public class StringRequest extends Request<String> {
private final Listener<String> mListener;
public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
}
public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
this(0, url, listener, errorListener);
}
...省略
}

有两个构造函数,其中第一个比第二个多了一个请求的方法,如果采用第二个则默认是GET请求。好了,我们试着用GET方法来请求百度:

//创建请求队列
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest mStringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("wangshu", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("wangshu", error.getMessage(), error);
}
});
//将请求添加在请求队列中
mQueue.add(mStringRequest);

当然别忘了添加网络访问权限:

<uses-permission android:name="android.permission.INTERNET"/>

请求结果不用说是百度界面的html文件:

这里写图片描述

4.JsonRequest的用法

和StringRequest类似,我们直接上代码:

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST,"http://api.1-blog.com/biz/bizserver/article/list.do",
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("wangshu", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("wangshu", error.getMessage(), error);
}
}
);
mQueue.add(mJsonObjectRequest);

运行程序返回的是一堆新闻的Json数据:
这里写图片描述

为了解析这些Json数据,我们用Gson来解析Json数据。点击这里下载Gson将jar包放在libs目录下并add进工程中。我们开始写article类用于存储数据:

public class Article {
private String desc;
private String status;
private List<detail> detail = new ArrayList<detail>();
public List<Article.detail> getDetail() {
return detail;
}
public void setDetail(List<Article.detail> detail) {
this.detail = detail;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public class detail {
private String title;
private String article_url;
private String my_abstract;
private String article_type;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArticle_url() {
return article_url;
}
public void setArticle_url(String article_url) {
this.article_url = article_url;
}
public String getMy_abstract() {
return my_abstract;
}
public void setMy_abstract(String my_abstract) {
this.my_abstract = my_abstract;
}
public String getArticle_type() {
return article_type;
}
public void setArticle_type(String article_type) {
this.article_type = article_type;
}
}
}

最后我们改写JsonRequest的请求回调:

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST,"http://api.1-blog.com/biz/bizserver/article/list.do",
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Article mArticle=new Gson().fromJson(response.toString(), Article.class);
List<Article.detail>mList=mArticle.getDetail();
String title=mList.get(0).getTitle();
Log.d("wangshu", title);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("wangshu", error.getMessage(), error);
}
}
);
mQueue.add(mJsonObjectRequest);

来看看打印结果:
这里写图片描述

5.使用ImageRequest加载图片

ImageRequest已经是过时的方法了,和前面两种的用法类似:

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageRequest imageRequest = new ImageRequest(
"http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iv_image.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
iv_image.setImageResource(R.drawable.ico_default);
}
});
mQueue.add(imageRequest);

查看ImageRequest的源码发现它可以设置你想要的图片的最大宽度和高度,在加载图片时如果图片超过期望的最大宽度和高度则会进行压缩:

public ImageRequest(String url, Listener<Bitmap> listener, int maxWidth, int maxHeight, ScaleType scaleType, Config decodeConfig, ErrorListener errorListener) {
super(0, url, errorListener);
this.setRetryPolicy(new DefaultRetryPolicy(1000, 2, 2.0F));
this.mListener = listener;
this.mDecodeConfig = decodeConfig;
this.mMaxWidth = maxWidth;
this.mMaxHeight = maxHeight;
this.mScaleType = scaleType;
}

6.使用ImageLoader加载图片

ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能,同时还可以过滤重复链接,避免重复发送请求。

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_image,R.drawable.ico_default, R.drawable.ico_default);
imageLoader.get("http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg", listener);

与ImageRequest实现效果不同的是,ImageLoader加载图片会先显示默认的图片,等待图片加载完成才会显示在ImageView上。
这里写图片描述 这里写图片描述

当然ImageLoader也提供了设置最大宽度和高度的方法:

public ImageLoader.ImageContainer get(String requestUrl, ImageLoader.ImageListener imageListener, int maxWidth, int maxHeight) {
return this.get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
}

7.使用NetworkImageView加载图片

NetworkImageView是一个自定义控件,继承自ImageView,封装了请求网络加载图片的功能。
先在布局中引用:

<com.android.volley.toolbox.NetworkImageView
android:id="@+id/nv_image"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerHorizontal="true"
android:layout_below="@id/iv_image"
android:layout_marginTop="20dp"
></com.android.volley.toolbox.NetworkImageView>

代码中调用,和ImageLoader用法类似:

iv_image = (ImageView) this.findViewById(R.id.iv_image);
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
nv_image.setDefaultImageResId(R.drawable.ico_default);
nv_image.setErrorImageResId(R.drawable.ico_default);
nv_image.setImageUrl("http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg",
imageLoader);

NetworkImageView并没有提供设置最大宽度和高度的方法,根据我们设置控件的宽和高结合网络图片的宽和高内部会自动去实现压缩,如果我们不想要压缩可以设置NetworkImageView控件的宽和高都为wrap_content。

github源码下载地址

点击进入原文地址

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 萝卜花刀切步骤图 水刀拼花图 蓑衣花刀的切法图解 西瓜皮拉花走刀图新手 瓷砖水刀拼花图案 花键滚刀 神刀花平 花刀的切法 水刀拼花机器多少钱 种花要除草一人来一刀打一字 刀花 花刀 松鼠桂鱼标准花刀 整条鱼的简单花刀切法 霸武刀王 天虫土 母其弥雅被刀挑开胸衣 防弹衣能防刀吗 江湖风云录羽衣刀法获得 刀不语 刀不语全文免费阅读 刀语 刀不语全本免费 刀不语不可能的世界 刀谱 刀豆 老刀豆 刀豆土豆的做法 什么是刀豆 老刀豆图片 刀豆图片 刀豆是什么 刀豆怎么吃 刀豆的功效与作用图片 刀豆做法 刀豆的做法 腌制刀豆 刀豆怎么腌制 刀豆的做法大全 刀豆怎么腌制好吃 刀豆有毒吗 刀豆怎么炒