比来负责带领公司项目重构,重构的时刻发明项目琅绫擎同时在应用两个图片加载框架,andriod-universal-image-loader和fresco,这两个框架其实都挺好的,不过项目琅绫擎不克不及同时应用两个框架。因为他们初始化和运行的时刻都须要分派必定的内存,如许会导致缓存图片的内存变大年夜,如不雅不知情分派过大年夜,还有可能导致隐形的oom。
问了以前的老员工都说不知道具体原因,说是汗青遗留问题。
应用矩阵扭转图片
紧缩图片
出现闪烁的页面
最后一个老员工说,一个类似发同伙圈功能的处所,如不雅用户选择了多张图片待发送,这个时刻用户又点击删除某张图片,这个时刻剩下的图片列表就会出现闪烁问题,说用fresco解决不了,用imageloader就不会出现闪烁的问题。晕,总不克不及因为要解决一个问题惹人一个700kb的第三方框架吧!
fresco是facebook出品,在稳定性和调用简略单纯性方面照样值得信赖的。andriod-universal-image-loader比较大年夜,并且似乎很长时光也不怎么保护和更新了。最后决定应用fresco框架。
应用fresco那么就面对本身解决加载图片闪烁的问题,其实所有图片框架道理都大年夜同小异,起首去memory琅绫擎加载,没有找到就是去本地缓存sdcard琅绫擎查找加载,如不雅还没有,那么没办法只能应用收集大年夜图片办事器加载了。
回归正题,导致删除图片闪躲的原因是什么呢?
删除一张图片后,须要对图片列表进行刷新操作,这个时刻须要从新大年夜sdcard琅绫擎攫取图片,这么问题就来了,因为如今的手机拍照机像素都异常高,很多多少都是4000*2500的,你可以测试一下BitmapFactory.decodeFile()大年夜sdcard加载一张如许大年夜小的图片须要300多ms,如不雅加上扭改变换,那么至少须要1500多ms。你想肯定会出现卡顿闪烁的问题了。
第一步:创建一个hashmap保存bitmap对象,切切记得bitmap要用弱引用,防止加载过多导致oom。
弱引用保存对象
第二步:大年夜map中直接掏出bitmap,如不雅不为空就直接显示,为空就大年夜sdcard中加载。
断定大年夜sdcard照样大年夜内存中
第三步:记得开启开启多线程加载,本地看似挺快,图片多了也会anr,也会卡顿。用户体验不好。
多线程sdcard加载图片
第四步:这琅绫擎有两个比较关键的技巧点。
1、加载bitmap的时刻,对图片进行紧缩。
2、对于三星手机拍┞氛后图片扭转问题,若何对图片进行扭转处理。
获取图片扭转角度
知道导致原因,那么若何解决?
- 必须对Bitmap做缩略图处理。
- 对于已经加载过的进行memory缓存处理。废话不多说,直接上代码吧!
以上就是解决问题的所有代码,总共加起来不到100行,问题都解决了,最重要用这不到100行代码,调换了一个700kb阁下的图片加载框架,这个才是解决问题的最大年夜收益。
如今的法度榜样员有一个通病就是都是爱好拿来主义,啥都爱好用第三方的,别人现成的,导致如今很多多少公司的项目惹人大年夜量的第三方库,有很多仅仅用了不到千分之一的功能,你说何必呢?本身分析下,几行代码往往就可以解决了。
最后送给所有的it同伙一句话,欲望引起你们的共勉。
- 所有复杂问题要简单化,所有简单问题照样要简单化。
【编辑推荐】
- Android 8.1开辟者预览版宣布 启用全新安然协定“DNS over TLS
- Android Studio3支撑Java8了,就问你敢用吗
- Android、iOS汗青版本比较
- 谷歌宣布了修复 KRACK WPA2 马脚的 Android 补丁
- Android Support库各版本功能介绍
推荐阅读
基于 Github 和 Stack Overflow 上的活泼度以及 Google 搜刮结不雅,The Data Incubator 比来制造了一个 23 个热点深度进修库的排名。下表显示了标准化后的分数,个中值 1 表示高于平均值>>>详细阅读
地址:http://www.17bianji.com/lsqh/38640.html
1/2 1