引言

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

一般地在使用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/.

Fresco 多图加载之ResizeOptions的更多相关文章

  1. AMap地图加载完成事件

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. Openlayers+Geoserver(一):项目介绍以及地图加载

           项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...

  3. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

    原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...

  4. Android高清巨图加载方案

    1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...

  5. arcgis 瓦片图加载规则(转载)

    arcgis 瓦片图加载规则 最近需要做地图离线的功能,要能下载指定区域的瓦片图,我们都知道如何加载谷歌和天地图的加载规则,但是网上貌似没有找到如何加载arcgis自己发布的瓦片图规则,好不容易找到一 ...

  6. Leaflet+heatmap实现离线地图加载和热力图应用

    本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...

  7. arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  8. 微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor

    微软必应地图在chrome浏览器加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor, 原因是没有等待地图API加 ...

  9. [Canvas]RPG游戏雏形 (地图加载,英雄出现并移动)

    源码请点此下载并用浏览器打开index.html观看 图例: 代码: <!DOCTYPE html> <html lang="utf-8"> <met ...

随机推荐

  1. winform 读取TXT文件 放在Label中 分类: WinForm 2014-07-31 09:56 310人阅读 评论(0) 收藏

    <span style="font-family: Arial, Helvetica, sans-serif;">#region 读取TXT 文件,放到Label中&l ...

  2. The app references non-public selectors in Payload

    上周上传app到appstore在validation完后有警告提示"The app references non-public selectors in Payload/wacao.app ...

  3. dreamvc框架(一)ioc容器的集成

    我的dreamvc框架最终写得差点儿相同了,借鉴了非常多开源框架,SpringMVC.Struts2等,眼下放在github上面.地址请猛戳我 写得差点儿相同了,是要写一个总结,把自己当时的思路记录下 ...

  4. libcurl使用演示样例

    简要说明:C++使用libcurl訪问"www.baidu.com".获取返回码和打印出http文件 /* * @ libcurl使用演示样例 * @ 2014.04.29 * @ ...

  5. python-gdb

    https://blog.log4d.com/2013/11/python-gdb/ https://wiki.python.org/moin/DebuggingWithGdb

  6. Java基础知识强化12:Java中运用数组的四种排序方法

    1.使用JavaApi文档中的Arrays类中的sort()进行快速排序 首先我们直接看代码如下: package himi.text; import java.util.Arrays; public ...

  7. wpf提示背景,资源样式

    查找资源时多用element.TryFindResource() <TextBox FontSize="17" Height="26" Margin=&q ...

  8. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

  9. Tomcat-java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory

    在我的MyEclipse中新建一个网站,并新建一个.jsp文件,配置server为Tomcat后,运行.jsp文件的时候,报错:java.lang.ClassNotFoundException: or ...

  10. 那些常用的eclipse快捷键

    用了很久的eclipse了,有些快捷键常用,有的偶尔使用,现在记下常用的快捷键,以便大家和自己查用(持续更新) 这些快捷键都可以在[window]-[preferences]-[general]-[k ...