【实训】图片异步加载框架Universal-Image-Loader介绍

相信很多做过Android的人都遇到过异步加载大量图片的问题,大家一般是怎么做的呢?如果全部手动编写固然不错。。。但是会遇到很多的麻烦,比如OOM、图片加载错乱、图片的缓存等问题,对于我们这种上学期间的小项目或者课设等,未免太过麻烦了。所以使用一些dalao已经开发完成的开源框架是个不错的选择。


Universal-Image-Loader就是一个很好的选择,这是一个比较早期的框架,由nostra13创作,已经有好几年了,所以网上的资料也比较多,使用也很方便,最新版本是v1.9.5 (27.11.2015)

github地址:https://github.com/nostra13/Android-Universal-Image-Loader


本文章只是简单的叙说其用法,不做很详尽的深入理解



一.添加依赖

从上面的github链接下载jar包,并将其添加进项目


二.使用过程

1.Manifest权限设置


读取外部存储和网络使用

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

2.ImageLoader的初始化和配置


这段代码一般放在Application类下,但放在其他地方按照程序设计情况也可。

主要配置了缓存,还有很多参数在作者github上可以找到。

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
		.threadPriority(Thread.NORM_PRIORITY - 2)
		.denyCacheImageMultipleSizesInMemory()
		.diskCacheFileNameGenerator(new Md5FileNameGenerator())
		.diskCacheSize(200 * 1024 * 1024) //200MB
		.tasksProcessingOrder(QueueProcessingType.LIFO)
		.build();
ImageLoader.getInstance().init(config);
当然也可以用这段代码创建默认配置,其中this是context上下文

ImageLoaderConfiguration config = ImageLoaderConfiguration.createDefault(this);  
ImageLoader.getInstance().init(config);  

DisplayImageOptions图像处理选项,可以设置图像处理在各个情况下的操作

DisplayImageOptions mOptions = new DisplayImageOptions.Builder()
		.showImageOnLoading(R.color.white)   //加载过程中
		.showImageForEmptyUri(R.color.white) //uri为空时
		.showImageOnFail(R.color.white)      //加载失败时
		.cacheOnDisk(true)
		.cacheInMemory(true)                             //允许cache在内存和磁盘中
		.bitmapConfig(Bitmap.Config.RGB_565)             //图片压缩质量参数
		.build();

需要注意的是ImageLoader使用的是单例模式


3.加载图片

在布局文件中直接使用ImageView即可

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_img"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:adjustViewBounds="true"
    android:scaleType="centerCrop" />

在加载图片的位置,比如BindView时,加入

ImageLoader.getInstance().loadImage(XXXX);

其中loadImage的参数有多种,源代码中

public void loadImage(String uri, ImageLoadingListener listener)
public void loadImage(String uri, ImageSize targetImageSize, ImageLoadingListener listener)
public void loadImage(String uri, DisplayImageOptions options, ImageLoadingListener listener)
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,ImageLoadingListener listener)
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,ImageLoadingListener listener, ImageLoadingProgressListener progressListener)

稍微解释下

uri:图片uri,可以是网址,也可以是,本地资源的Uri

listener:图片加载监听器,有4个状态,加载开始,失败,完成,取消,下文再详细介绍

targetImageSize:需要指定的图片大小(宽、高)

options:图像处理选项,可以使用上面一开始初始化的,也可以重新创建不同设置的

progressListener:加载监听器


我们参数选择uri、options、listener,其他的可以自己摸索

ImageLoader.getInstance().loadImage("www.xxxx.com/aaa.jpg",mOptions, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String s, View view) {
                //开始加载的时候
            }

            @Override
            public void onLoadingFailed(String s, View view, FailReason failReason) {
                //加载失败的时候 
            }

            @Override
            public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                //加载成功的时候
                            //可以直接使用加载完的bitmapfa放在控件上
            }

            @Override
            public void onLoadingCancelled(String s, View view) {
                //加载取消的时候 
            }
        });

还有另一种方法,我们可能会更加喜欢

 ImageLoader.getInstance().displayImage(xxxx);

同样,参数也有很多


public void displayImage(String uri, ImageView imageView)
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options)
public void displayImage(String uri, ImageView imageView, ImageLoadingListener listener)
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener)
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)


不同是有个参数,imageView,就是我们需要显示图片的控件,所以一般代码可以这样写(这个是加载本地图片的,网络图片更改uri即可)

ImageView img = (ImageView)findViewById(R.id.item_img);
ImageLoader.getInstance().displayImage("file://" + path, img , mOptions);  
其中图片各种情况下的显示可以在mOptions中设置


----------------------------------------------------------------------------------------------------------------------------------------------------------


基本上,简单的Universal-Image-Loader就介绍完毕了,应该可以满足学生小项目的需要了(笑)。当然,我们最好还是自己慢慢地去摸索其用法,根据作者的源代码了解其原理,这样是很有好处的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值