1.Android-Universal-Image-Loader
giehub地址::https://github.com/nostra13/Android-Universal-Image-Loader这个框架是我最早使用的一款老牌框架,至今仍有许多开发者在用,不过该项目已经不再继续维护了,所以在此不推荐使用
使用方法:在自定义的application里进行配置,可参考以下代码:
//创建默认的ImageLoader配置参数
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
this)
.memoryCacheExtraOptions(600, 600)
// max width, max height,即保存的每个缓存文件的最大长宽
.threadPoolSize(3)
// 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new WeakMemoryCache()) // 弱缓存,缓存bitmap的总大小没有限制,唯一不足的地方就是不稳定,缓存的图片容易被回收掉
// .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))//建议内存设在5-10M,可以有比较好的表现
// You can pass your own memory cache
// implementation/你可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator())
// 将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100)
// 缓存的文件数量
.discCache(
new UnlimitedDiscCache(new File(Environment
.getExternalStorageDirectory()
+ "/Westwinglife/imgCache")))
// 自定义缓存路径
.defaultDisplayImageOptions(getDisplayOptions())
.imageDownloader(
new BaseImageDownloader(this, 5 * 1000, 30 * 1000))
.writeDebugLogs() // Remove for release app
.build();// 开始构建
ImageLoader.getInstance().init(config);
public DisplayImageOptions getDisplayOptions() {
DisplayImageOptions options;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.defult_good_img) // 设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.defult_good_img)// 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.defult_good_img) // 设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
.cacheOnDisc(true)// 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)// 设置图片以如何的编码方式显示
// .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型//
// .delayBeforeLoading(int delayInMillis)//int
// delayInMillis为你设置的下载前的延迟时间
// 设置图片加入缓存前,对bitmap进行设置
// .preProcessor(BitmapProcessor preProcessor)
.resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
.displayer(new RoundedBitmapDisplayer(20))// 是否设置为圆角,弧度为多少
.displayer(new FadeInBitmapDisplayer(100)) // 是否图片加载好后渐入的动画时间
.build();// 构建完成
return options;
}
这样配置完成之后就可以在项目中使用了,
imageLoader.displayImage方法简单易用,第一次使用的时候感觉非常棒,单例模式,三级缓存,各种状态 图片的配置显示.配置好的话还可以避免很多oom的问题
2.Picasso
giehub地址:https://github.com/square/picassopicasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存功能。仅仅只需要一行代码就能完全实
现图片的异步加载:
dependencies { compile 'com.squareup.picasso:picasso:2.5.1' }
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
这也是一款老牌的图片加载库,不过和UIL生在同一时期光芒必定会被有所遮盖,不过随着UIL的停止维护,Picasso的
光芒也将绽放
3.Glide
giehub地址:https://github.com/bumptech/glide在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。这是一款比较流行的图片加载框架,傻瓜式的集成和使用吸引了大量的开发者,而且它的内存优化和加载速度也是非常给力的,Glide 默认的 Bitmap 格式是 RGB_565 格式,相较于Picasso的ARGB_8888的格式,内存开销减少一半,最重要的一个特性是 Glide 支持加载 Gif 动态图,而 Picasso 不支持该特性。dependencies { compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.android.support:support-v4:22.0.0' }
Glide.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg);
4.Fresco
giehub地址:https://github.com/facebook/fresco
Fresco 是 Facebook 出品,他是新一代的图片加载库,我们知道 Android 应用程序可用的内存有限,经常会因为图片加载导致 OOM ,虽然我们有各种手段去优化,尽量减少出现 OOM 的可能性,但是永远没法避免,尤其某些低端手机 OOM 更是严重。而 Facebook 就另辟蹊径,既然没法在 Java 层处理,我们就在更底层的 Native 堆做手脚。于是 Fresco 将图片放到一个特别的内存区域叫 Ashmem 区,就是属于 Native 堆,图片将不再占用 App 的内存,Java 层对此无能为力,这里是属于 C++ 的地盘,所以能大大的减少 OOM。后期的这些图片加载框架的集成和使用都是越来越简单方便,Fresco的集成和使用和glide差不多.不能说越新的框架越好,但至少趋势是这样,Fresco库比较大,比较适合含有大量图片的APP去使用,实乃加载大图之必备良品,而一般的应用使用Picasso或者glide完全可以搞定这里推荐Fresco的中文网,里面可以满足你几乎所有的需求:https://www.fresco-cn.org/docs/index.html
写这篇博客的目的仅作工作记录,留以后查看