当前位置: 首页 > 科技观察

Android解决ListView加载图片闪烁的问题

时间:2023-03-12 02:38:39 科技观察

最近负责领导公司的项目重构。重构的时候发现项目同时使用了两个图片加载框架,andriod-universal-image-loader和fresco。这两个框架其实都很好。好的,但是你不能在项目中同时使用这两个框架。因为它们在初始化和运行时需要分配一定的内存,这会导致缓存图片的内存变大。如果在不知情的情况下分配过大,也可能造成无形的oom。我问以前的老员工,他们说不知道具体原因,说是历史遗留问题。页面出现闪烁***一位老员工说,在一个类似于发朋友圈功能的地方,如果用户选择多张图片发送,此时用户点击删除某张图片,剩下的图片此时会显示列表。有一个闪烁的问题,说是用fresco解决不了,用imageloader不会有闪烁的问题。晕,总不能为了解决一个问题就引入一个700kb的第三方框架吧!Fresco是Facebook出品的,在稳定性和易调用性上还是值得信赖的。andriod-universal-image-loader比较大,好像很久没有维护和更新了。***决定使用fresco框架。如果使用fresco,就会面临加载图片时闪烁的问题。事实上,所有图像帧的原理都是相似的。首先,将它们加载到内存中。从图像服务器加载。回到正题,闪避删图的原因是什么?删除图片后,需要刷新图片列表。都很高大上,很多都是4000*2500的,你可以测试一下BitmapFactory.decodeFile()从sdcard加载一张这个尺寸的图片需要300多ms,如果加上旋转变换,至少需要1500多发性硬化症。你觉得肯定会有卡顿和闪烁的问题。知道了原因,那么如何解决呢?位图必须作为缩略图处理。对加载的进行内存缓存处理。废话不多说,直接上代码!第一步:创建一个hashmap来保存bitmap对象,记住bitmap要使用弱引用,防止加载过多OOM。第二步弱引用保存对象:直接从map中取出位图,不为空则直接显示,为空则从sdcard加载。从sdcard或者从内存来看第三步:记得开启多线程加载,本地好像很快,图片太多会anr,会卡顿。用户体验不好。多线程sdcard加载图片第四步:这里有两个关键的技术点。1.加载位图时,压缩图像。压缩图片2、三星手机拍照后图片旋转的问题,如何旋转图片。获取图像旋转角度,使用矩阵旋转图像。以上就是解决问题的全部代码。总共不到100行,问题解决。最重要的是用不到100行代码替换了一个700kb左右的图片加载框架。这是解决问题的最大好处。现在程序员的一个通病就是喜欢主义,凡事喜欢用第三方的,别人现成的。导致现在很多公司的项目引入了大量的第三方库,很多只使用了不到其中的千分之一。一个功能,为什么这么说呢?自己分析后,往往几行代码就可以解决。***送给所有it的朋友,希望能引起大家的共勉。凡是复杂的问题都要简化,凡是简单的问题都要简化。