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 ...
随机推荐
- Google幻灯片
本博文的主要内容有 .Google幻灯片的介绍 https://www.google.com/intl/zh-CN/slides/about/ 自行去注册Google账号,这里,不多赘述.
- 320. Generalized Abbreviation
首先想到的是DFS,对于每个单词的字母都遍历,比如 spy: 1py,s1y,sp1 然后每个遍历完的单词再DFS..左右有数字就合并比如 1py: 11y=>2py, 1p1 这样.. 但是单 ...
- 【转】java 文件 读取目录下的所有文件(包括子目录)
转自:http://www.cnblogs.com/pricks/archive/2009/11/11/1601044.html import java.io.File; import java.io ...
- servlet清晰理解
servlet介绍 Servlet看起来像是通常的Java程序.它是JSP的前身,在MVC架构中担任Controller的角色,即控制层.主要进行数据的处理操作和流程的控制,并将有关结果存储到Java ...
- Adatper中获取宽高为0的问题
但是我们想在getView()中获取ImageView的宽和高存在问题,在getView()里面刚开始显示item的时候利用ImageView.getWidth() 获取的都是0,为什么刚开始获取不到 ...
- 超人学院Hadoop大数据资源分享
超人学院Hadoop大数据资源分享 http://bbs.superwu.cn/forum.php?mod=viewthread&tid=770&extra=page%3D1 很多其它 ...
- [RxJS] Filtering operators: takeLast, last
Operators take(), skip(), and first() all refer to values emitted in the beginning of an Observable ...
- cs模式与bs模式
关于CS(Client-Server)模式和BS(Browser-Server)模式的水很深,盆地自己也认为对此了解不够透彻,但作为手机客户端设计,如果不对CS.BS做一定程度的了解,是很容易出现一 ...
- objective-c IBOutletCollection介绍
objective-c IBOutletCollection介绍 将UI控件和源码进行链接时,方法的表示方法是IBAction,控件属性对象是IBOutlet.如果想将一个同类型的UI控件作为一个组放 ...
- Oracle中wm_concat()的使用方法
以下两种方式使用wm_concat()的使用方法是等效的. 方法一:使用窗口函数,wm_concat支持窗口函数 select distinct classKey,className, classOr ...