Android开源项目推荐之「图片加载到底哪家强」
可以看到前四个是大家比较熟知的图片加载库,有 UniversalImageLoader、Picasso、Fresco、Glide,
至于第五个 ion 其实是一个网络库,只不过也提供了图片加载的功能,跟 Volley 类似,也提供图片加载的功能,
但是如果图片加载是一个强需求的话,我更喜欢专注的库,所以本文只讨论单纯的图片加载库。
我相信大家很纠结到底该选择哪一个呢?貌似它们在GitHub上都有自己的一席之地,Star 数都蛮高的,确实很难抉择,
那么今天我就来给大家分析下,图片加载到底该怎么选择!
①UniversalImageLoader:
https://github.com/nostra13/Android-Universal-Image-Loader
UIL可以算是老牌最火的图片加载库了,使用过这个开源库的项目可以说是多的令人发指,
即使到现在 GitHub 上他的 Star 数仍然是众多图片加载库最多的。
可惜的是该作者在项目中说明,从去年的9月份,他就已经停止了对该项目的维护。
这就意味着以后任何的 bug 都不会修复,任何的新特性都不会再继续开发,所以毫无疑问 UIL 不推荐在项目中使用了。
②Picasso:
https://github.com/square/picasso
Picasso 是 Square 公司的大作,名字起的也这么文艺,叫「毕加索」,意为加载图片就像画画一样,是一门艺术。
这个库是我之前一直很喜欢的,因为他不仅具备图片加载应有尽有的强大功能,他的调用也是如此简洁文艺:
Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView);
以上代码就是给一个 ImageView 加载远程图片的一个示例,是不是很简洁?
当然不止如此,他还提供更多的用法,足以满足你实际项目中的各种需求,具体这些用法本文就不提了,
可以去官网自行研究。
③Glide
https://github.com/bumptech/glide
Glide 是 Google一位员工的大作,他完全是基于 Picasso 的,沿袭了 Picasso 的简洁风格,但是在此做了大量优化与改进。
Glide 默认的 Bitmap 格式是 RGB_565 格式,而 Picasso 默认的是 ARGB_8888 格式,这个内存开销要小一半。
在磁盘缓存方面,Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,
也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的图片尺寸,
比如你 ImageView 大小是200*200,原图是 400*400 ,而使用 Glide 就会缓存 200*200 规格的图,
而 Picasso 只会缓存 400*400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,
毕竟少了每次裁剪重新渲染的过程。
最重要的一个特性是 Glide 支持加载 Gif 动态图,而 Picasso 不支持该特性。
除此之外,还有很多其他配置选项的增加。
总体来说,Glide 是在 Picasso 基础之上进行的二次开发,各个方面做了不少改进,
不过这也导致他的包比 Picasso 大不少,不过也就不到 500k,Picasso 是100多k,
方法数也比 Picasso 多不少,不过毕竟级别还是蛮小的,影响不是很大。
④Fresco
https://github.com/facebook/fresco
Fresco 是 Facebook 出品,他是新一代的图片加载库,我们知道 Android 应用程序可用的内存有限,
经常会因为图片加载导致 OOM,虽然我们有各种手段去优化,尽量减少出现 OOM 的可能性,但是永远没法避免,
尤其某些低端手机 OOM 更是严重。而 Facebook 就另辟蹊径,既然没法在 Java 层处理,
我们就在更底层的 Native 堆做手脚。于是 Fresco 将图片放到一个特别的内存区域叫 Ashmem 区,
就是属于 Native 堆,图片将不再占用 App 的内存,Java 层对此无能为力,这里是属于 C++ 的地盘,
所以能大大的减少 OOM。
所以此库很强大,不过用起来也比较复杂,包也比较大,貌似有2、3M,底层涉及到的 C++ 领域,想读源码也比较困难。
⑤总结对比:
综合来看,毫无疑问 Glide 与 Picasso 之间优先推荐选择 Glide,
尤其是如果你的项目想要支持 Gif 动态图,那更该选择 Glide 。
但是如果你的项目使用了 Square 公司的全家桶,如 Retrofit 或者 OkHttp ,
那么搭配 Picasso 一起使用也不是不可,兼容性可能会更好些,占用体积也会少些。
对于一般的 App 使用 Fresco 未免有些大材小用了,大部分情况 Glide 都能满足你的需求了,
但是如果你的 App 中大量使用图片,比如是类似 Instagram 一类的图片社交 App ,那么推荐使用 Fresco ,
虽然稍复杂,但是还是推荐使用 Fresco ,对提升你 App 的性能与体验有不少帮助,
值得花时间去研究并应用到自己的 App 上来。
一、Picasso下载图片:
(1)官网:http://square.github.io/picasso/ Github: https://github.com/square/picasso
(2)它的特性:
a.自带内存和硬盘二级缓存功能;
b.加载本地资源,资产,sd卡,以及contentProvider里面的图片;
c.解决了图片错位的问题;
d.使用图片压缩尽可能的减少的内存;
e.图形转换操作,如变换大小,旋转,或者自定义转换操作;
(3)基本使用:
首先我们需要配置权限;
A.基本加载方式:
a.网络图片:
//显示网址图片
Picasso.with(this).load(PathUtils.getPicPath()).into(imgShow);
b.资源图片:
Picasso.with(this).load(R.drawable.lede_app_list).into(imgShow);
c.资产图片:
//加载资产中图片
Picasso.with(this).load("file:///android_asset/login_bg.png").into(imgShow);
d.sd卡图片:
Picasso.with(this).load(new File("/sdcard/20160318160906384.png")).into(imgShow);
B.设置图片占位:
Picasso设置图片下载前和下载失败的图片,在出错的图片设置前都会尝试3次请求,
3次失败之后会显示错误图片。
Picasso.with(this)
.load(R.drawable.lede_app_list)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(imgShow);
-----------------------------------
C.无淡入淡出效果:
.noFade()
D.图片重新调整大小:
重新调整大小,以便更好的适配布局,减少存储空间;
.resize(100,100)
.resizeDimen() //加载资源dimen里面定义的值
.resizeDimen(R.dimen.width,R.dimen.height)
E.图片旋转:
rotate(90)
F.设置图片格式:
可以使用RGB_565来节省内存,默认情况下是RGB_8888的图片格式;
.config(Bitmap.Config.RGB_565)
G.新进程中查看大图:
点击查看大图的时候往往容易内存溢出,在新的进程中打开的话可以避免这个问题,
只需要在清单文件中设置process属性;
<activity android:name=".BigImageActivity"
android:process=":picture">
</activity>
(4)在Application中的常用设置:
package com.example.jiangqiangwei.mypicassodemo;
import android.app.Application;
import android.graphics.Bitmap;
import com.squareup.picasso.LruCache;
import com.squareup.picasso.Picasso;
/**
* Created by jiangqiangwei on 16/8/4.
* 全局处理参数
*/
public class MyApplication extends Application{
private static MyApplication myApplication;
public Picasso picasso;
@Override
public void onCreate() {
super.onCreate();
myApplication=this;
setPicassoConfig();
}
private void setPicassoConfig() {
//设置picasso加载参数
picasso=new Picasso.Builder(this)
//设置内存缓存大小
.memoryCache(new LruCache(10<<20))
//设置图片显示格式
.defaultBitmapConfig(Bitmap.Config.RGB_565)
//设置下载器UrlConnectionDownloader
//使用OkHttp,同时设置磁盘缓存和位置大小
//.downloader(new UrlConnectionDownloader(myApplication))
//可以设置下载图片用的工具
//.downloader(new OkHttpDownloader(this.getCacheDir(),10<<20))
//设置图片左上角的标记
//红色:代表从网络下载的图片
//蓝色:代表从磁盘缓存中加载图片
//绿色:代表从内存中加载图片
//设置调试模式
.indicatorsEnabled(true)
.build();
Picasso.setSingletonInstance(picasso);
}
}
一、Glide下载图片:
(1)基本使用:
A).先导包;
B).DrawableRequestBuilder常用设置方法;
C).
a.网络图片:
//显示网址图片
Glide.with(this).load(PathUtils.getPicPath()).into(imgShow);
b.资源图片:
Glide.with(this).load(R.drawable.lede_app_list).into(imgShow);
c.资产图片:
//加载资产中图片
Glide.with(this).load("file:///android_asset/login_bg.png").into(imgShow);
d.sd卡图片:
Glide.with(this).load(new File("/sdcard/20160318160906384.png")).into(imgShow);
D).设置图片占位:
Glide.with(this)
.load(R.drawable.lede_app_list)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(imgShow);
E).淡入淡出:
crossFade()
F).不添加动画:
.dontAnimate()
G).图片重新调整大小:
.override(100,100)
(二)Glide高级用法以及性能优化:
A)设置网络访问库:
B)监听加载进度:
C)自定义缓存:
D)清除缓存:
E)自定义图形转换Transformation:

本文对比了五种Android图片加载库:UniversalImageLoader、Picasso、Fresco、Glide及ion。详细分析了各库的特点、优缺点,并推荐了适合不同场景的最佳选择。
964

被折叠的 条评论
为什么被折叠?



