Volley 笔记

来源:互联网 发布:itc网络广播厂家电话 编辑:程序博客网 时间:2024/05/21 10:32


  郭大神的Volley解析

一,简介

android中的Http请求通常有两种,HttpURLConnectionHttpClient。

Volley是由Android开发团队开发的,在2016年的google I/O大会推出的网络通讯框架。他把AsyncHttp

Client和Universal-Image-Loader的有点集于一身,既可以像AsyncHttpClient一样进行网络通信,还可以像Universal-Image-Loader一样加载网络图片。适用于数据量不大,但通信频繁的网络操作,对于数据量较大的操作,比如下载文件,Volley表现的很差。


1,StringRequest

//创建对象RequestQueue queue=Volley.newRequestQueue(this);
quene是一个请求队列,他可以缓存所有的Http请求,然后按一定的算法并发的发送这些请求。所以我们不用每一次Http请求都创建一个RequestQueue对象,基本上在每个需要进行网络交互的Activity页面创建一个RequestQueue就行了。

//发送请求String url="http://www.baidu.com";Listener<String> listener=new Listener<String>() {@Overridepublic void onResponse(String response) {Log.i(TAG, response);}};ErrorListener errorListener=new ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.i(TAG, error.getMessage());}};StringRequest request=new StringRequest(Method.GET,url, listener, errorListener);
</pre><pre name="code" class="java"><pre name="code" class="java">//将请求添加到RequestQueen中queue.add(request);

<span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);"><span style="white-space:pre"></span>如果是post方式的话,还需要提交参数,但是StringRequest没有设置参数的方法,但但是,</span><span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);">当发出POST请求的时候,</span><span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);">Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数</span><span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);">,所以,我们可以重写父类的</span><span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);">getParams</span><span style="font-family: "Microsoft YaHei"; background-color: rgb(255, 255, 255);">方法,</span>

StringRequest request2=new StringRequest(Method.POST, url, listener, errorListener){@Overrideprotected Map<String, String> getParams() throws AuthFailureError {HashMap<String , String > map=new HashMap<String, String>();map.put("params1", "values1");return map;}};queue.add(request2);

2,JsonRequest

JsonRequest是一个抽象类,我们一般使用的是他的两个子类 JsonObjectRequest和JsonArrayRequest,


//发送请求String url="http://www.baidu.com";JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(url, null, new Listener<JSONObject>() {//第二个参数是请求参数@Overridepublic void onResponse(JSONObject response) {Log.i(TAG, response.toString());}}, new ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e(TAG, error.getMessage());}});queue.add(jsonObjectRequest);

3,ImageRequest

用法和之前的大同小异

RequestQueue queue=Volley.newRequestQueue(this);String url= "http://sc.admin5.com/uploads/allimg/100222/14153T363-0.jpg";//有点慢啊!ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {imageView.setImageBitmap(response);}}, 0, 0, Config.RGB_565, new ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {imageView.setImageResource(R.drawable.ic_launcher);}});queue.add(request);
可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。缺点是有点慢啊!

4,ImageLoader

Volley在请求网络图片方面可以做到的还远远不止这些,而ImageLoader就是一个很好的例子。ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求

//创建ImageLoaderImageLoader imageLoader=new ImageLoader(queue, new ImageCache() {@Overridepublic void putBitmap(String url, Bitmap bitmap) {// TODO Auto-generated method stub}@Overridepublic Bitmap getBitmap(String url) {// TODO Auto-generated method stubreturn null;}});//创建ImageListenerImageListener imageListener=imageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.work_state_press);//调用ImageLoader的get()方法加载网络上的图片。imageLoader.get(url, imageListener);


这里没有为图片设置缓存,缓存最好使用LruCache

class BitmapCache implements 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();              }          };      }@Overridepublic Bitmap getBitmap(String url) {// TODO Auto-generated method stub return mCache.get(url);  }@Overridepublic void putBitmap(String url, Bitmap bitmap) {  mCache.put(url, bitmap);  }}

ImageLoader imageLoader=new ImageLoader(queue,bitmapCache);//这里是bitmapCache,页面初始化的时候new,每次加载都new的话就起不到缓存的作用了(被自己蠢到哭)
图片的缓存大小设置问10M。

这时有的朋友可能就会问了,使用ImageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩,而NetworkImageView中则完全没有提供设置最大宽度和高度的方法,那么是不是使用NetworkImageView来加载的图片都不会进行压缩呢?


其实并不是这样的,NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。这是由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。


当然了,如果你不想对图片进行压缩的话,其实也很简单,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。





0 0