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/.

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/xyczero/p/5021788.html
Copyright © 2011-2022 走看看