本文主要是介绍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() {@Overridepublic void onLoadingStarted(String imageUri, View view) {Log.i(TAG, "开始加载......");}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {Log.i(TAG, "加载失败......");}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {Log.i(TAG, "加载完成......");}@Overridepublic 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, "开始加载......");}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {Log.i(TAG, "加载失败......");}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {Log.i(TAG, "加载完成......");}@Overridepublic 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 cardImageLoader.getInstance().displayImage("file://" + uri, imageView);}/*** 从assets文件夹中异步加载图片*/public void dispalyFromAssets(String imageName, ImageView imageView) {// String imageUri = "assets://image.png"; // from assetsImageLoader.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包 点击下载
这篇关于ImageLoader如何用的更好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!