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/.
Fresco 多图加载之ResizeOptions的更多相关文章
- AMap地图加载完成事件
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- Openlayers+Geoserver(一):项目介绍以及地图加载
项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...
- ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...
- Android高清巨图加载方案
1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...
- arcgis 瓦片图加载规则(转载)
arcgis 瓦片图加载规则 最近需要做地图离线的功能,要能下载指定区域的瓦片图,我们都知道如何加载谷歌和天地图的加载规则,但是网上貌似没有找到如何加载arcgis自己发布的瓦片图规则,好不容易找到一 ...
- Leaflet+heatmap实现离线地图加载和热力图应用
本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...
- arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 微软必应地图加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor
微软必应地图在chrome浏览器加载错误:Uncaught TypeError: Microsoft.Maps.Location is not a constructor, 原因是没有等待地图API加 ...
- [Canvas]RPG游戏雏形 (地图加载,英雄出现并移动)
源码请点此下载并用浏览器打开index.html观看 图例: 代码: <!DOCTYPE html> <html lang="utf-8"> <met ...
随机推荐
- 自动布局AutoLayout
1:理解概念 Auto Layout 中文翻译过来意思是 自动布局 ,通过内定的 Constraint (约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图. 将我们想象中的 ...
- bzoj2132: 圈地计划
要分成两坨对吧.. 所以显然最小割 但是不兹辞啊.. 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来,减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 ...
- Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解
Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放.这个柜架也包 ...
- MyEclipse_6.0.1GA_E3.3.1集成版下载地址
因在开发中经常使用到myeclipse 对比相关版本,还是觉得6.0 –6.5 比较适合开发,其他的开发起来比较卡,下面是下载地址 MyEclipse_6.0.1GA_E3.3.1集成版下载地址: ...
- FaceBook要在视频领域打败YouTube?
据<纽约时报>报道,FaceBook正在探索一项新的策略来直接把音乐视频嵌入到用户的News Feeds中.目前,具有代表性的视频网站有YouTube和Vimeo,它们可以在社交网络上分享 ...
- centos 6 搭建ftp服务器支持匿名读写
转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/ 郭文学<guowenxue@gmail.com> vsftpd在运行时一定要关闭SELinux,否 ...
- Java-Android 之电话拨号源码
file:///F:/workspace3/Android_ver2.4/src/cn/szy/com/MainActivity.java package cn.szy.com; import and ...
- 查询两个日期(时间)以内的数据,between and 或 and 连>= <=,to_date()
between and 方法 select * from kk.kkhmd where larq between(to_date('2008-9-3','yyyy-mm-dd')) and (to_d ...
- angular调用WCF服务,读取文件夹下图片显示列表,下载另存为图片
读取文件夹下的文件 public string ReadImagesPaths() { string result = string.Empty; try { string path = System ...
- IE6 png兼容问题
1.IE6 png <!--[if IE 6]> <script src="../js/png.js" type="text/javascript& ...