Android 图片加载框架 (三)

探究 Fresco 的实现原理

先看 blog

Fresco 功能列表

  • 加载进度提示
  • 圆角图片
  • 渐进式加载
  • 显示动图GIF
  • 多图请求
  • 监听下载
  • 缩放 旋转

缓存处理

Fresco 的缓存也是一大亮点,它采用了三级缓存的方式,分别是:

  • Bitmap缓存
  • 未解码图片缓存
  • 图片文件缓存。
public void initFresco(Context context, String diskCacheUniqueName){
    DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
            .setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
            .setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
            .setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
            .build();

    ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
            .setMainDiskCacheConfig(diskCacheConfig)
            .build();
    Fresco.initialize(context, config);
}

注意:在Android 5.0以下,bitmap 缓存位于 ashmem 区域,而在Android 5.0以上,bitmap 和其他框架一样,缓存在 Java Heap 之上。因为Android 5.0系统之上,内存管理有了很大改进,OOM 的情况减少了不少。

Android 的内存资源是十分有限的,加载图片的时候经常会 出现 OOM 的情况,虽然可以采用各种方法去优化内存的使用,但是却无法再本质上解决内存 资源稀缺的问题。OOM 问题在低端机上问题尤为严重,而 Facebook 另辟蹊径,在更加底层的 Native 层做处理,不去占用 Java 虚拟机层宝贵的内存资源。Fresco 将图片当道一个叫 Ashmem 的区域,这样由于图片不占用 Java 虚拟机的资源,所以大大减少了OOM

内存开销对比 Glide

点击这里查看数据图表

可以看到 Java heap 基本为 Glide 的一倍, 但是 max native heap 接近 Glide 的十倍。

  • Java Heap是对于Java 虚拟机而说的,一般的大小上限是 16M 24M 48M 76M 具体视手机而定。
  • Native Heap是对于C/C++直接操纵的系统堆内存,所以它的上限一般是具体RAM的2/3左右。
  • 所以对于2G的手机而言,Java Heap 大概76M,而Native Heap是760M左右,相差10倍。

小结

优点

  • 最大的优势在于5.0以下(最低2.3)的bitmap加载。在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem区)
  • 大大减少OOM(在更底层的Native层对OOM进行处理,图片将不再占用App的内存)
  • 适用于需要高性能加载大量图片的场景

缺点

  • 包较大(2~3M)
  • 用法复杂
  • 底层涉及c++领域,阅读源码深入学习难度大
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值