Android -- 图片加载常用库

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

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:
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值