ImageLoader如何用的更好

写在前面的话:相信每一个Android的app都少不了图片的加载,每一个Android程序员都少不了去写加载图片的代码,自己写的图片加载不知道大家有没有遇到很多问题,比如图片加载缓慢,同时加载多个图片时会有卡顿,加载大图时还会出现OOM等等各种问题,下面就为大家介绍一下我在项目中使用ImageLoader(开源框架)加载图片的用法和一些技巧

那么imageloader有那么特性呢?我这儿只说最常见的几个也是用的最多的几个,想要进一步了解imageloader原理请访问这篇博客。

imageloader的主要特性

1、内置线程池,使用多线程下载

2、图片可以是来自网络也可以是自己项目中的

3、使用缓存机制,内存缓存,文件系统缓存,sd卡缓存

4、各种自定义的配置,包括线程池的大小,图片的缓存,加载图片的质量,加载失败时默认的图片,甚至图片的格式等等,会在后面详细讲到

那么说了这么多特性,imageloader到底怎么用呢?毕竟我们不是搞理论的

看了网上一些人写的关于imageloader的博客,imageloader都是在activity中去初始化的,简单的初始化比如这样:

//创建默认的ImageLoader配置参数  
ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);  <pre name="code" class="java">//根据配置获取imageloader的实例
ImageLoader.getInstance().init(configuration);

 
大家看到getInstance()这个方法第一个想到的是什么?我想到的是imageloader它有可能是一个单例模式,即在整个项目中只有一个实例,查看它的源码,果然是,还发现它在初始化的时候做了同步处理 

imageloader实例获取的源码

public static ImageLoader getInstance() {
	if (instance == null) {//为null就去创建一个对象,否则返回已有的对象
			synchronized (ImageLoader.class) {//同步处理,防止多个地方同一时刻创建多个实例
				if (instance == null) {
					instance = new ImageLoader();
				}
			}
		}
		return instance;
	}

既然它是一个单例模式,那我们就没必要在每次使用它的时候都去在activity中调用一次创建配置,初始化的方法了,我们可以把它的初始化放到我们项目里自定义的MyApplication类中,这样在整个项目中只去实例化一次,在其他地方直接用就可以了。

MyApplication类中实例化的代码

File cacheDir = StorageUtils.getCacheDirectory(CONTEXT);  //缓存文件夹路径
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(CONTEXT)
		        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
		        .threadPoolSize(5) //  线程池内加载的数量,一般默认为3-5个
		        .threadPriority(Thread.NORM_PRIORITY - 2) //  设置当前线程的优先级
		        .denyCacheImageMultipleSizesInMemory()//设置拒绝缓存在内存中一个图片多个大小 默认为允许,(同一个图片URL)根据不同大小的imageview保存不同大小图片
		        .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
		        .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值
		        .memoryCacheSizePercentage(13) // default
		        .discCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径  
		        .discCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
		        .discCacheFileCount(100)  // 可以缓存的文件数量 
		        .imageDownloader(new BaseImageDownloader(CONTEXT)) // default
		        .imageDecoder(new BaseImageDecoder(false)) // default
		        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
		        .writeDebugLogs() // 打印debug log
		        .build(); //开始构建
		ImageLoader.getInstance().init(config);//获取实例


其实imageloader还有很多的自定义配置参数,需要了解的请点击这里

那么我们如何在activity中使用呢?

imageloader加载网络图片

ImageView imageview = (ImageView)findViewByID(R.id.iv)
ImageLoader.getInstance().displayImage(url,imageView);
使用起来是不是很方便呢。。。

有时候我们需要监听加载的过程,比如开始加载,加载完成等,imageloader也给我们提供了很好的方法

imageView_2 = (ImageView) findViewById(R.id.iv_2);
		String url1 = "http://p0.so.qhimg.com/t015ecc8be48fc4220f.jpg";
		ImageLoader.getInstance().displayImage(url1, imageView_2, new ImageLoadingListener() {
			@Override
			public void onLoadingStarted(String imageUri, View view) {
				Log.i(TAG, "开始加载......");
			}
			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
				Log.i(TAG, "加载失败......");
			}
			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
				Log.i(TAG, "加载完成......");
			}
			@Override
			public void onLoadingCancelled(String imageUri, View view) {
				Log.i(TAG, "取消加载......");
			}
		});

有时候我们需要在自己的activity中改变一下imageloader的配置参数,或者需要新增个配置参数,这个时候有2种办法,第一就是在MyApplication中去改,这样整个项目中的都改了,第二就是我们可以在用的地方去改,这样只在当前的activity中有效,整个项目中还是默认的配置

DisplayImageOptions options = new DisplayImageOptions.Builder()
	.showImageOnLoading(R.drawable.ic_launcher) // 设置图片在下载期间显示的图片
	.showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片
	.showImageOnFail(R.drawable.ic_launcher) // 设置图片加载/解码过程中错误时候显示的图片
	.considerExifParams(true)
	.cacheInMemory(false)// 设置下载的图片是否缓存在内存中
	.imageScaleType(ImageScaleType.NONE)// 设置图片以如何的编码方式显示
	.bitmapConfig(Bitmap.Config.ARGB_4444)// 设置图片的解码类型
	.build();// 构建完成
		
ImageLoader.getInstance().displayImage(url1, imageView_2, options, new ImageLoadingListener() {
	public void onLoadingStarted(String imageUri, View view) {
		Log.i(TAG, "开始加载......");
	}
	@Override
	public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
		Log.i(TAG, "加载失败......");
	}
	@Override
	public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
		Log.i(TAG, "加载完成......");
	}
	@Override
	public void onLoadingCancelled(String imageUri, View view) {
	<span style="white-space:pre">	</span>Log.i(TAG, "取消加载......");
	}
});
加载本地图片
项目中大多数情况下是加载网络上的图片,但有时候也有可能去加载一张本地的图片,那么imageloader如何去加载一个本地的图片呢?

 /**
     * 从内存卡中异步加载本地图片
     */
    public void displayFromSDCard(String uri, ImageView imageView) {
        // String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
        ImageLoader.getInstance().displayImage("file://" + uri, imageView);
    }

    /**
     * 从assets文件夹中异步加载图片
     */
    public void dispalyFromAssets(String imageName, ImageView imageView) {
        // String imageUri = "assets://image.png"; // from assets
        ImageLoader.getInstance().displayImage("assets://" + imageName,
                imageView);
    }

    /**
     * 从drawable中异步加载本地图片
     */
    public void displayFromDrawable(int imageId, ImageView imageView) {
        // String imageUri = "drawable://" + R.drawable.image; // from drawables
        // (only images, non-9patch)
        ImageLoader.getInstance().displayImage("drawable://" + imageId,
                imageView);
    }
有一天你突发奇想,在imageloader加载图片的时候你想要让它给你返回一个bitmap的对象,你在某个地方要用到,强大的imageloader也提供了这样的方法

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(url);

其实imageloader的强大之处还远不止于此,开发过程中会遇到各种问题,就要靠我们去查看源码,找到解决的办法啦。。。


imageloader的jar包  点击下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值