资讯专栏INFORMATION COLUMN

Android网络编程3之Volley用法全解析

Code4App / 2293人阅读

摘要:前言想必很多人都用过,为了建立网络编程的知识体系,是必须要讲的知识点,所以我这里有必要再次介绍一下的使用。简介在年大会上推出了一个新的网络通信框架。在使用前请下载库并放在目录下并到工程中。

前言

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

1.Volley简介

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

2.Volley网络请求队列

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

</>复制代码

  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
3.StringRequest的用法

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

</>复制代码

  1. public class StringRequest extends Request {
  2. private final Listener mListener;
  3. public StringRequest(int method, String url, Listener listener, ErrorListener errorListener) {
  4. super(method, url, errorListener);
  5. this.mListener = listener;
  6. }
  7. public StringRequest(String url, Listener listener, ErrorListener errorListener) {
  8. this(0, url, listener, errorListener);
  9. }
  10. ...省略
  11. }

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

</>复制代码

  1. //创建请求队列
  2. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
  3. StringRequest mStringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com",
  4. new Response.Listener() {
  5. @Override
  6. public void onResponse(String response) {
  7. Log.i("wangshu", response);
  8. }
  9. }, new Response.ErrorListener() {
  10. @Override
  11. public void onErrorResponse(VolleyError error) {
  12. Log.e("wangshu", error.getMessage(), error);
  13. }
  14. });
  15. //将请求添加在请求队列中
  16. mQueue.add(mStringRequest);

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

</>复制代码

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

4.JsonRequest的用法

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

</>复制代码

  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
  2. JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST,"http://api.1-blog.com/biz/bizserver/article/list.do",
  3. new Response.Listener() {
  4. @Override
  5. public void onResponse(JSONObject response) {
  6. Log.d("wangshu", response.toString());
  7. }
  8. }, new Response.ErrorListener() {
  9. @Override
  10. public void onErrorResponse(VolleyError error) {
  11. Log.e("wangshu", error.getMessage(), error);
  12. }
  13. }
  14. );
  15. mQueue.add(mJsonObjectRequest);

运行程序返回的是一堆新闻的Json数据:

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

</>复制代码

  1. public class Article {
  2. private String desc;
  3. private String status;
  4. private List detail = new ArrayList();
  5. public List getDetail() {
  6. return detail;
  7. }
  8. public void setDetail(List detail) {
  9. this.detail = detail;
  10. }
  11. public String getDesc() {
  12. return desc;
  13. }
  14. public void setDesc(String desc) {
  15. this.desc = desc;
  16. }
  17. public String getStatus() {
  18. return status;
  19. }
  20. public void setStatus(String status) {
  21. this.status = status;
  22. }
  23. public class detail {
  24. private String title;
  25. private String article_url;
  26. private String my_abstract;
  27. private String article_type;
  28. public String getTitle() {
  29. return title;
  30. }
  31. public void setTitle(String title) {
  32. this.title = title;
  33. }
  34. public String getArticle_url() {
  35. return article_url;
  36. }
  37. public void setArticle_url(String article_url) {
  38. this.article_url = article_url;
  39. }
  40. public String getMy_abstract() {
  41. return my_abstract;
  42. }
  43. public void setMy_abstract(String my_abstract) {
  44. this.my_abstract = my_abstract;
  45. }
  46. public String getArticle_type() {
  47. return article_type;
  48. }
  49. public void setArticle_type(String article_type) {
  50. this.article_type = article_type;
  51. }
  52. }
  53. }

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

</>复制代码

  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
  2. JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST,"http://api.1-blog.com/biz/bizserver/article/list.do",
  3. new Response.Listener() {
  4. @Override
  5. public void onResponse(JSONObject response) {
  6. Article mArticle=new Gson().fromJson(response.toString(), Article.class);
  7. ListmList=mArticle.getDetail();
  8. String title=mList.get(0).getTitle();
  9. Log.d("wangshu", title);
  10. }
  11. }, new Response.ErrorListener() {
  12. @Override
  13. public void onErrorResponse(VolleyError error) {
  14. Log.e("wangshu", error.getMessage(), error);
  15. }
  16. }
  17. );
  18. mQueue.add(mJsonObjectRequest);

来看看打印结果:

5.使用ImageRequest加载图片

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

</>复制代码

  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
  2. ImageRequest imageRequest = new ImageRequest(
  3. "http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg",
  4. new Response.Listener() {
  5. @Override
  6. public void onResponse(Bitmap response) {
  7. iv_image.setImageBitmap(response);
  8. }
  9. }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
  10. @Override
  11. public void onErrorResponse(VolleyError error) {
  12. iv_image.setImageResource(R.drawable.ico_default);
  13. }
  14. });
  15. mQueue.add(imageRequest);

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

</>复制代码

  1. public ImageRequest(String url, Listener listener, int maxWidth, int maxHeight, ScaleType scaleType, Config decodeConfig, ErrorListener errorListener) {
  2. super(0, url, errorListener);
  3. this.setRetryPolicy(new DefaultRetryPolicy(1000, 2, 2.0F));
  4. this.mListener = listener;
  5. this.mDecodeConfig = decodeConfig;
  6. this.mMaxWidth = maxWidth;
  7. this.mMaxHeight = maxHeight;
  8. this.mScaleType = scaleType;
  9. }
6.使用ImageLoader加载图片

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

</>复制代码

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

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

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

</>复制代码

  1. public ImageLoader.ImageContainer get(String requestUrl, ImageLoader.ImageListener imageListener, int maxWidth, int maxHeight) {
  2. return this.get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
  3. }
7.使用NetworkImageView加载图片

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

</>复制代码

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

</>复制代码

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

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

github源码下载

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70591.html

相关文章

  • Android网络编程5OkHttp2.x用法解析

    摘要:需要注意的是回调并不是在线程。也可以通过来同时取消多个请求。在开始创建的时候配置好,在请求网络的时候用将请求的结果回调给线程。最后调用这个的方法请求成功使用起来简单多了,而且请求结果回调是在线程的。 前言 讲完了Volley,我们接下来看看目前比较火的网络框架OkHttp, 它处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失...

    wemall 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<