笔记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对象,可以调用如下方法获取到:

RequestQueue mQueue = Volley.newRequestQueue(context);

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

ImageRequest imageRequest = new ImageRequest(  
        "http://developer.android.com/images/home/aw_dac.png",  //请求的网络图片地址
        new Response.Listener<Bitmap>() {  //服务器访问成功的数据回调
            @Override  
            public void onResponse(Bitmap response) {  
                imageView.setImageBitmap(response);  
            }  
        }, 0, 0,//限制图片的高度和宽度,0为不限制
 Config.RGB_565,//图片的属性 ARGB_8888
 new Response.ErrorListener() {  //服务器访问失败的回调
            @Override  
            public void onErrorResponse(VolleyError error) {  
                imageView.setImageResource(R.drawable.default_image);  
            }  
        }); 
mQueue.add(imageRequest);  //将imageRequest对象添加到mQueue运行

二. ImageLoader的用法

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

  1. 创建一个RequestQueue对象。
  2. 创建一个ImageLoader对象。
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {  
    @Override  
    public void putBitmap(String url, Bitmap bitmap) {  
    }  

    @Override  
    public Bitmap getBitmap(String url) {  
        return null;  
    }  
});
  1. 获取一个ImageListener对象。
ImageListener listener = ImageLoader.getImageListener(imageView,  //用于显示imageView的对象
        R.drawable.default_image, //加载过程中显示的图片
 R.drawable.failed_image);  //加载失败显示的图片
  1. 调用ImageLoader的get()方法加载网络上的图片。
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", //图片的地址
listener);

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

imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  
                listener, 200, 200);

运行的加载效果:

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

public 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();  
            }  
        };  
    }  

    @Override  
    public Bitmap getBitmap(String url) {  
        return mCache.get(url);  
    }  

    @Override  
    public void putBitmap(String url, Bitmap bitmap) {  
        mCache.put(url, bitmap);  
    }    
}

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

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

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


三. NetworkImageView的用法

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

  1. 创建一个RequestQueue对象。
  2. 创建一个ImageLoader对象。
  3. 在布局文件中添加一个NetworkImageView控件。
<com.android.volley.toolbox.NetworkImageView   
        android:id="@+id/network_image_view"  
        android:layout_width="200dp"  
        android:layout_height="200dp"  
        android:layout_gravity="center_horizontal"  
        />
  1. 在代码中获取该控件的实例。
  2. 设置要加载的图片地址。
networkImageView.setDefaultImageResId(R.drawable.default_image);  //加载中显示的图片
networkImageView.setErrorImageResId(R.drawable.failed_image);  //加载失败显示的图片
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  //加载的图片地址
                BitmapCache); //

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


原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-10-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android学习之路

Android的广播

20712
来自专栏xingoo, 一个梦想做发明家的程序员

大数据之Yarn——Capacity调度器概念以及配置

试想一下,你现在所在的公司有一个hadoop的集群。但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求。那么他们肯定会遇到同时提交...

2329
来自专栏WD学习记录

8-26 Android学习ing

在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所件事。当用户触发了输...

723
来自专栏IT可乐

RabbitMQ详解(三)------RabbitMQ的五种队列

  上一篇博客我们介绍了RabbitMQ消息通信中的一些基本概念,这篇博客我们介绍 RabbitMQ 的五种工作模式,这也是实际使用RabbitMQ需要重点关注...

992
来自专栏IMWeb前端团队

浏览器进程?线程?傻傻分不清楚!

本文作者:IMWeb coverguo 原文出处:IMWeb社区 未经同意,禁止转载 在生活中,浏览器和我们的工作和生活息息相关。做为前端开发,我们...

2209
来自专栏文渊之博

SQLServer中的死锁的介绍

简介 什么是死锁?      我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且...

1835
来自专栏青玉伏案

iOS开发之线程间的MachPort通信与子线程中的Notification转发

如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification。简单的说,M...

2478
来自专栏HT

Zip 压缩和解压技术在 HTML5 中的应用

JSZip 是一款可以创建、读取、修改 .zip 文件的 javaScript 工具。在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有...

2948
来自专栏菩提树下的杨过

java: web应用中不经意的内存泄露

前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1、定义一个类App ...

2039
来自专栏性能与架构

Mysql 监控 Innodb 阻塞状况

数据库的监控点中,阻塞情况是一个重要指标,Innodb 是主流存储引擎,下面实验一下如何监控器阻塞状态 模拟阻塞状态 使用两个MySQL客户端连接同一个MySQ...

3465

扫码关注云+社区