zoukankan      html  css  js  c++  java
  • Fresco 多图加载之ResizeOptions

    引言

    最近圈子开发工作比较重再加上寒冬已至,所以停了两个月没写,手有点生,好吧,这都是借口,我承认~( ̄▽ ̄~),下面回归正题。

    一般地在使用Fresco图片的时候,无需担心图片大小的问题,因为
    通常服务器返回的图片大小不会非常夸张,但当你需要从手机本地图库中加载多图的时候,例如相册选择器,这时你就不得不考虑图片的大小问题了,因为由于android系统分配给每个app的内存是有限的,而用户的本地图片大小是无法控制的,所以当同时加载多张大图时就很容易造成OOM的问题。

    解决OOM

    Fresco支持对图片的裁减,为了防止在加载本地图片出现OOM,我们可以在加载图片时直接配置好裁剪的参数,这样就可以基本防止了app出现OOM的情况。示例代码如下,很简单:

    ResizeOptions options = new ResizeOptions(width, height);
    public static void displayImage(File imageFile , SimpleDraweeView imageView, ResizeOptions options) {
                ImageRequest request = ImageRequestBuilder
                .newBuilderWithSource(Uri.fromFile(image))
                .setResizeOptions(options)
                .build();
    	 ... ...
        }
    

    但是问题到这里并没有完全解决!

    使用ResizeOptions后仍然会OOM

    有时你会发现当即使用了ResizeOptions后,特别是加载本地多图时仍然会发生OOM,或加载页面会异常的卡顿忙,或者有的图片加载不出来,黑屏。是ResizeOptions的bug吗?答案肯定不是,造成的原因就在于你的使用姿势不正确

    • 不正确姿势1:
      ResizeOptions的参数设置有问题。
      这里的参数问题指的是你设置的裁剪宽高值仍然太大了,并没有很好的适应的你需求。例如当一个页面类似于图片相册显示多张本地图片时,如果你直接根据屏幕的宽度等分(如: 屏宽/3)的值来设置参数,就有可能出现图片无法加载的情况,因为本地图片可能十几M甚至更大,在这样的情况下直接以分辨率进行裁剪,在某些性能较差的手机上图片就可能显示不出来。

    • 不争取姿势2:
      ResizeOptions只支持JPG格式的图片。
      这一点Fresco在官方文档上有非常明确的说明,如图:
      附上官方说明链接 ResizeOptions

      这个问题一般只有在加载本地图片时在容易遇到,因为一般应用从服务器接受的图片都是JPG格式的,但手机本地图片就非常多了,如最常见的PNG等都是不支持裁剪的,所以当你信心满满的设置好ResizeOptions后发现加载大图时手机仍然OOM了。(这就是吃了不仔细看官方文档的亏!当时被坑了好久才发现-。-)

    解决ResizeOptions支持格式的问题

    关于这个问题其实在github上已经有很多提出了,只不过很多人并知道是ResizeOptions支持格式的问题,只是在描述他们出现的问题。在这里非常感谢tyronen,他在issues上归类了这一类问题,并非常明确的指出了问题所在

    在fresco最新的版本上增加了一个新的功能:Downsampling,它处理图片的速度比常规的裁剪更快,并且同时支持PNG,JPG以及WEP格式的图片,非常强大。其使用方式也很简单,在配置ResizeOptions方法的基础上,再把ImagePipelineConfig中的Downsampling开关打开即可,代码如下:

        ImagePipelineConfig.newBuilder(context). .setDownsampleEnabled(true).build();
    

    但不得不提醒的是,在目前最新的0.8.1上该功能仍为试验功能,所以当你决定在项目上使用该功能时一定要做好相关的风险预估。

    最后附上官方文档的具体说明 Downsampling

    结语

    开源库的力量非常强大,但并不是完美的,我们在使用时千万不能无脑复制黏贴,要留心说明文档,以及适当阅读相关源码,这样才能做到更好的使用开源库和提升自己,避免很多不必要的弯路。

    作者:XycZero
    查看原文:http://www.xyczero.com/blog/article/28/.

  • 相关阅读:
    一本通1559跳跳棋
    一本通1558聚会
    一本通1555【例 4】次小生成树
    P1880 [NOI1995]石子合并
    P2066 机器分配
    P2073 送花
    P1886 滑动窗口
    P1637 三元上升子序列
    P1533 可怜的狗狗
    P1631 序列合并
  • 原文地址:https://www.cnblogs.com/xyczero/p/5021788.html
Copyright © 2011-2022 走看看