关闭

Android网络编程(三)Volley用法全解析

标签: volleyvolley使用volley解析volley加载图片
14748人阅读 评论(19) 收藏 举报
分类:

相关文章
Android网络编程(一)HTTP协议原理
Android网络编程(二)HttpClient与HttpURLConnection

前言

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源码下载

16
0
查看评论

Android Volley完全解析(一),初识Volley的基本用法

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用...
  • sinyu890807
  • sinyu890807
  • 2014-04-10 09:45
  • 303567

Volley===Volley框架的基本使用方法

现在开发app,可以说离不开网络操作,今天给大家介绍一下android网络框架volley的使用方法。 volley简介 Volley主页 https://android.googlesource.com/platform/frameworks/volley  Gi...
  • IT1039871366
  • IT1039871366
  • 2016-01-29 17:14
  • 5496

Android Volley完全解析

Android Volley完全解析(一),初识Volley的基本用法 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避免...
  • ysh06201418
  • ysh06201418
  • 2015-06-10 16:13
  • 87695

Volley超时重试机制详解

Volley超时重试机制基础用法Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下:int DEFAULT_TIMEOUT_MS = 10000; int DEFAULT_MAX_RETRIES = 3...
  • zinss26914
  • zinss26914
  • 2016-12-03 17:01
  • 6082

Volley支持https的3种方法小结

最近遇到网络安全方面的问题,所以要使用https,由于在工程中使用了Volley,所以对Volley的https做了一些研究,当然大部分是参考的网络上一些前辈们的成果,自己进行一下总结。 https涉及到证书的认证方式,我就按认证的类型来说明: 1,全部信任证书; 2,信任指定证书; 3,信任系...
  • lintax
  • lintax
  • 2017-04-08 20:15
  • 2611

Volley的引用导致内存泄漏

Volley的引用导致内存泄漏  前两天用leakcanary检查自己做的应用时,发现居然报内存泄漏的错误,而且内存泄漏出现的原因是由于Volley使 用的问题,查看leakcanary打出的Log发现是由于Volley中的Listener导致,这让我很疑惑,为什么开源的框架Volley怎么会出现...
  • sdfdzx
  • sdfdzx
  • 2017-03-28 18:10
  • 866

Android Volley完全解析(一),初识Volley的基本用法

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我...
  • u012602304
  • u012602304
  • 2018-01-26 11:12
  • 18

Android 网络通信框架Volley简介(Google IO 2013)

1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley发布了。Volley是And...
  • t12x3456
  • t12x3456
  • 2013-07-02 09:15
  • 556281

Gson解析和Volley框架并用

package com.example.liuyazhou.mythirdapplication; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view...
  • u010002184
  • u010002184
  • 2016-09-15 19:01
  • 1162

Volley 框架的介绍和使用

转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025一:volley 简介究竟什么是volley呢,在以前的开发过程中,我们需要和网络进行通信的时候,使用的东西包括:httpclient,HttpURLConnection,...
  • u011546655
  • u011546655
  • 2016-03-11 14:57
  • 7382
    我的新书
    个人资料
    • 访问:1913602次
    • 积分:16643
    • 等级:
    • 排名:第729名
    • 原创:191篇
    • 转载:52篇
    • 译文:0篇
    • 评论:1020条
    我的微博
    最新评论
    公众号
    百度统计