笔记13 | 练习Volley(二)加载网络图片的三种方法

​地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/78144382郭霖:http://blog.csdn.net/guolinblog/article/details/17482165

经过上一篇的复习,对volley的StringRequest和JsonRequest的基本用法有了初步的了解,这篇文章来练习加载网络图片的用法。

目录

  • ImageRequest的用法

  • ImageLoader的用法

  • NetworkImageView的用法

  • 链接




一. ImageRequest的用法


ImageRequest,也是继承自Request的,因此它的用法也是基本相同的,首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:

 
 
  1. RequestQueue mQueue = Volley.newRequestQueue(context);  

然后去new出一个ImageRequest对象了,代码如下所示:

 
 
  1. ImageRequest imageRequest = new ImageRequest(  

  2.        "http://developer.android.com/images/home/aw_dac.png",  //请求的网络图片地址

  3.        new Response.Listener<Bitmap>() {  //服务器访问成功的数据回调

  4.            @Override  

  5.            public void onResponse(Bitmap response) {  

  6.                imageView.setImageBitmap(response);  

  7.            }  

  8.        }, 0, 0,//限制图片的高度和宽度,0为不限制

  9. Config.RGB_565,//图片的属性 ARGB_8888

  10. new Response.ErrorListener() {  //服务器访问失败的回调

  11.            @Override  

  12.            public void onErrorResponse(VolleyError error) {  

  13.                imageView.setImageResource(R.drawable.default_image);  

  14.            }  

  15.        });

  16. mQueue.add(imageRequest);  //将imageRequest对象添加到mQueue运行


二. ImageLoader的用法

ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader已经不是继承自Request的了,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可以分为以下四步:

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

 
 
  1. ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {  

  2.    @Override  

  3.    public void putBitmap(String url, Bitmap bitmap) {  

  4.    }  

  5.    @Override  

  6.    public Bitmap getBitmap(String url) {  

  7.        return null;  

  8.    }  

  9. });  

  1. 获取一个ImageListener对象。

 
 
  1. ImageListener listener = ImageLoader.getImageListener(imageView,  //用于显示imageView的对象

  2.        R.drawable.default_image, //加载过程中显示的图片

  3. R.drawable.failed_image);  //加载失败显示的图片

  1. 调用ImageLoader的get()方法加载网络上的图片。

 
 
  1. imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", //图片的地址

  2. listener);  

如果对图有需要现在的话用:

 
 
  1. imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  

  2.                listener, 200, 200);  

运行的加载效果:


缓存机制的实现,新建一个BitmapCache并实现了ImageCache接口:

 
 
  1. public class BitmapCache implements ImageCache {  

  2.    private LruCache<String, Bitmap> mCache;  

  3.    public BitmapCache() {  

  4.        int maxSize = 10 * 1024 * 1024;  

  5.        mCache = new LruCache<String, Bitmap>(maxSize) {  

  6.            @Override  

  7.            protected int sizeOf(String key, Bitmap bitmap) {  

  8.                return bitmap.getRowBytes() * bitmap.getHeight();  

  9.            }  

  10.        };  

  11.    }  

  12.    @Override  

  13.    public Bitmap getBitmap(String url) {  

  14.        return mCache.get(url);  

  15.    }  

  16.    @Override  

  17.    public void putBitmap(String url, Bitmap bitmap) {  

  18.        mCache.put(url, bitmap);  

  19.    }    

  20. }

这里我们将缓存图片的大小设置为10M,然后将第二个步骤改为:

 
 
  1. ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());  

将BitmapCache传后,即充分利用了ImageLoader的缓存优势了!


三. NetworkImageView的用法

NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 在布局文件中添加一个NetworkImageView控件。

 
 
  1. <com.android.volley.toolbox.NetworkImageView  

  2.        android:id="@+id/network_image_view"  

  3.        android:layout_width="200dp"  

  4.        android:layout_height="200dp"  

  5.        android:layout_gravity="center_horizontal"  

  6.        />

  1. 在代码中获取该控件的实例。

  2. 设置要加载的图片地址。

 
 
  1. networkImageView.setDefaultImageResId(R.drawable.default_image);  //加载中显示的图片

  2. networkImageView.setErrorImageResId(R.drawable.failed_image);  //加载失败显示的图片

  3. networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  //加载的图片地址

  4.                BitmapCache); //

NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。如果你不想对图片进行压缩的话,其实也很简单,只需要在布局文件中把NetworkImageView的layoutwidth和layoutheight都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。


四. 链接

>笔记11 | 动态设置TextView的字体大小

>笔记10 | 学习整理静态static 和 终态final

>[Android笔记9]使用wifi连接adb打印数据

>[Android笔记8]使用Zxing实现二维码扫描


本节结束




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值