Android网络异步请求库Volley简介与基本用法

Android网络异步请求库Volley简介与基本用法

一、Volley简介
在开发Android应用的时候不可避免的需要使用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接受网络数据。Android系统中主要提供了两种方式进行HTTP通信,HttpURLConnectionHttpClient(在Android 6.0之后被完全废弃)。
不过HttpURLConnection和HttpClient的用法稍微有些复杂,如果不进行适当封装,很容易写出不少重复代码。AsyncHttpClient网络框架把HTTP所有的通信细节全部封装在内部;Universal-Image-Loader使得在界面上显示网络图片的操作变得极其简单,开发者无需关心如何从网络获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经做好了一切。
Google在2013年推出了一个新的网络通信框架——Volley。Volley把AsyncHttpClient和Universal-Image-Loader的优点集于一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。
在这里插入图片描述
在性能上,其设计目标就是非常适合进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如下载文件等,Volley的表现就会非常糟糕。

二、Volley缺陷
前面说了,Volley的缺陷在于:对于大数据量的网络操作的表现会非常糟糕,比如下载上传大文件。那么为什么Volley不适合下载上传大文件,而适合数据量小的频率高的网络请求?
在这里插入图片描述
依据Volley的源码,Volley的网络请求线程池默认大小为4,意味着可以并发进行4个请求,大于4个,就会排在队列中。
在这里插入图片描述
Request的getBody()方法返回byte[]类型,作为Http.POST和Http.PUT body中的数据。这意味着需要把用http传输的数据一起读取到内存中,因此如果文件过大,内存容易出现oom。
在这里插入图片描述

三、Volley使用之GET请求

  1. 创建请求队列
    创建一个请求队列RequestQueue,以便存放应用程序中创建的请求。RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常适合高并发的,因此不必为每一次HTTP请求都创建一个对象,这样非常的浪费资源,基本在每个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。(此处的应用程序由于作为简单的demo,因此在Application中创建请求队列)
    在这里插入图片描述
  2. 根据请求数据返回的形式选择合适的Request对象
    Volley提供了StringRequest、JsonObjectRequest、JsonArrayRequest以及ImageRequest四种请求对象以供选择。
     StringRequest——主要用于不确定数据返回类型的情况
     JsonObjectRequest——主要用于返回的数据类型是JsonObject的情况
     JsonArrayRequest——主要用于返回的数据类型是JsonArray的情况
     ImageRequest——主要用于返回类型是Bitmap的情况。
    在这里插入图片描述
    值得注意的是StringRequest是包含JsonObjectRequest以及JsonArrayRequest这两种类型的,选择使用合适最接近的类型可以提升性能
  3. 生成请求对象
    生成请求对象StringRequest,可以注意到该对象传入的参数中,第一个参数表示请求方法如GET等,第二个参数为请求的网络url,第三个参数为请求成功后返回数据的回调,第四个参数为请求失败的回调。需要注意的是Volley已经为开发者实现了异步请求,即回调接口是处于主线程即UI线程中,而网络请求是出于子线程中的
    在这里插入图片描述
  4. 给请求设置tag标签
    在这里插入图片描述
    设置tag的目的在于,在进行网络请求的Activity中,当Activity的生命周期结束时,需要结束网络请求,因此需要在Activity的onStop()方法中使用RequestQueue的cancelAll()方法,该方法的参数为tag。
    在这里插入图片描述
  5. 将请求加入请求队列
    最后将该请求加入到请求队列中,请求队列根据其算法使用线程池中的线程并发地发送该请求。
    在这里插入图片描述

四、Volley使用之POST请求
POST请求的使用,绝大部分步骤是与GET请求是相同的,唯一的区别在于GET请求将要请求的参数以?+键值对的方式接在连接之后,而POST请求则是将数据放置在主体中。
StringRequest类中,通过重写getParams()方法,将POST的数据以键值对的形式存储到Map实例中,并返回。Volley会通过HttpURLConnection进行处理。
在这里插入图片描述
若返回的是JsonObject类型的数据,则采用JsonObjectRequest类,而JsonObjectRequest类的构造函数中有一个JsonObject类型的参数,用于传入需要POST的数据,如果是GET方式,则直接传入null即可。
在这里插入图片描述

五、Volley加载网络图片
前面提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架。而Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley同样可以实现基本类似的效果,并且在性能上毫不逊色

  1. ImageRequest的用法
    ImageRequest和其他三种Request对象一样继承于Request类,因此使用ImageRequest加载网络图片的方式和Volley中进行一般的网络请求差别不大,只是参数略有不同。
    在这里插入图片描述
    第一个参数为图片url;第二个参数为图片请求成功的回调;第三、四个参数用于指定允许图片的最大宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,那么会对图片进行压缩,指定成0的话表示不管图片多大都不会进行压缩;第五个参数用于指定图片的缩放类型;第六个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节大小,而RGB_565则表示每个图片像素占据2个字节大小(关于更多的Bitmap的知识参看后续笔记)。第七个参数是图片请求失败的回调
    在这里插入图片描述
  2. 使用LruCache、ImageCache和ImageLoader结合加载网络图片
    ImageLoader的优点在于可以起到图片缓存的作用,在创建ImageLoader的时候传入一个ImageCache,写一个性能非常好的ImageCache最好借助Android提供的LruCache功能(关于LruCache的介绍见后续笔记)。
    在这里插入图片描述
    创建ImageLoader的实例,该构造函数的参数依次为请求队列和图片缓存对象实例;获取ImageListener图片加载监听对象实例,参数依次为图片显示控件实例、默认显示的图片的id以及加载出错时显示的图片的id;调用ImageLoader的get()方法,参数依次为请求的图片url以及图片加载监听对象实例listener,从而加载图片。
    在这里插入图片描述
  3. 使用Volley自带的NetworkImageView结合ImageLoader进行图片加载
    不同于上述的两种方式,**NetworkImageView是Volley的一个自定义控件,**继承自ImageView,具备ImageView控件的所有功能,并且在原生的基础上加入了加载网络图片的功能
    在这里插入图片描述
    NetworkImageView控件的使用方法分为五步:
     创建一个RequestQueue对象
     创建一个ImageLoader对象
     在布局文件中添加一个NetworkImageView控件
     在代码中获取该控件的实例
     设置要加载的图片地址
    一个简单的例子如下。
    在这里插入图片描述
  4. NetworkImageView关于图片压缩的问题
    在这里插入图片描述
    前面提到的ImageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩,而NetworkImageView中则完全没有提供设置最大宽度和高度的方法,那么是不是使用NetworkImageView来记载图片就不会进行压缩?
    NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。原因在于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩
    如果不想对图片进行压缩,那么只需要在布局文件中将控件的layout_width和layout_height都设置为wrap_content即可。
    在这里插入图片描述

六、加载网络图片第三方库
目前加载网络图片的第三方库有很多,除了这里提到的Volley可以用于加载图片外,还有:
Fresco
Glide
Picasso
nostra13的ImageLoader
其中,个人比较推荐的是Fresco,其可以从网络、本地存储或者本地资源中加载图像,并显示占位图片,直到图片加载完毕。值得一提的是其拥有两级缓存,一个在内存中;另一个在内部存储中。

参考资料:Android网络请求——Volley的使用
Android Volley完全解析(一),初识Volley的基本用法
Android Volley完全解析(二),使用Volley加载网络图片
Volley为什么不适合下载上传大文件?为什么适合数据量小的频率高的请求?

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/89737374