Android 网络请求库:Volley

jopen 5年前

既然在android2.2之后不建议使用Http Client,那么有没有一个库是android2.2及以下版本使用Http Client,而android2.3及以上版本使用HttpUrlConnection的呢,答案是肯定的,就是Volley,它是android开发团队在2013年Google I/O大会上推出了一个新的网络通信框架

Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像 AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕

特点

  1. Volley的优势在于处理小文件的http请求;
  2. 在Volley中也是可以使用Okhttp作为传输层
  3. Volley在处理高分辨率的图像压缩上有很好的支持;
  4. NetworkImageView在GC的使用模式上更加保守,在请求清理上也更加积极,networkimageview仅仅依赖于强大的内存引用,并当一个新请求是来自ImageView或ImageView离开屏幕时 会清理掉所有的请求数据。

用法

  1. 创建一个RequestQueue对象。
  2. 创建一个Request对象。
  3. 将Request对象添加到RequestQueue里面。

下面一步一步来学习其用法

  • GET
 private void get(){          RequestQueue queue= Volley.newRequestQueue(getApplicationContext());          String url="http://121.41.119.107/test/index.php";          StringRequest request=new StringRequest(url, new Response.Listener<String>() {              @Override              public void onResponse(String response) {                  Log.d("TAG",response);              }          }, new Response.ErrorListener() {              @Override              public void onErrorResponse(VolleyError error) {                }          });          queue.add(request);      }

  • POST
    通过指定请求方法为Request.Method.POST使其成为post请求,然后重新getParams方法设置请求参数。当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数
private void post() {          RequestQueue queue = Volley.newRequestQueue(getApplicationContext());          String url = "http://121.41.119.107/test/login.php";          StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {              @Override              public void onResponse(String response) {                  Log.d("TAG", response);              }          }, new Response.ErrorListener() {              @Override              public void onErrorResponse(VolleyError error) {                }          }) {              //重写getParams方法设置参数              @Override              protected Map<String, String> getParams() throws AuthFailureError {                  Map<String, String> params = new HashMap<String, String>();                  params.put("user", "asas");                  params.put("pass", "12121");                  params.put("time", "1212121");                  return params;              }          };          queue.add(request);      }

  • 加载图片
    加载图像的方法和前面类似,只不过不在是StringRequest而是ImageRequest。
 private void getImage() {          RequestQueue queue = Volley.newRequestQueue(getApplicationContext());          String url = "https://www.baidu.com/img/bdlogo.png";          //第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。          //第五个参数就是ImageView里中的属性ScaleType          //第六个参数用于指定图片的颜色属性          ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {              @Override              public void onResponse(Bitmap response) {                  ImageView iv= (ImageView) findViewById(R.id.iv);                  iv.setImageBitmap(response);              }          }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {                @Override              public void onErrorResponse(VolleyError error) {                }          });          queue.add(request);      }

其实加载图片的功能还远远不止这些,使用ImageLoader可以实现对图片的缓存,还可以过滤重复链接,避免发送重复的请求
ImageLoader的使用方法概括为以下几步
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。
 //继承ImageCache,使用LruCache实现缓存      public class BitmapCache implements ImageLoader.ImageCache {          private LruCache<String, Bitmap> mCache;          public BitmapCache() {              int maxSize = 10 * 1024 * 1024;              mCache = new LruCache<String, Bitmap>(maxSize) {                  @Override                  protected int sizeOf(String key, Bitmap bitmap) {                      return bitmap.getRowBytes() * bitmap.getHeight();                  }              };          }          @Override          public Bitmap getBitmap(String url) {              return mCache.get(url);          }          @Override          public void putBitmap(String url, Bitmap bitmap) {              mCache.put(url, bitmap);          }        }      private void getImageByImageLoader() {          ImageView iv= (ImageView) findViewById(R.id.iv);          RequestQueue queue = Volley.newRequestQueue(getApplicationContext());          String url = "https://www.baidu.com/img/bdlogo.png";          ImageLoader loader=new ImageLoader(queue,new BitmapCache() );          // 第一个参数指定用于显示图片的ImageView控件          // 第二个参数指定加载图片的过程中显示的图片          // 第三个参数指定加载图片失败的情况下显示的图片          ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);          // 调用ImageLoader的get()方法来加载图片          // 第一个参数就是图片的URL地址          // 第二个参数则是刚刚获取到的ImageListener对象          // 如果想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度,即通过第三第四个参数指定          loader.get(url,listener);      }

最后,Volley提供了一种自定义ImageView来加载图片,其使用方法可概括为
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 在布局文件中添加一个NetworkImageView控件。
4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址。