先上个优化之后的fps图,丝滑流畅;具体实现请看最终优化后的app

背景:一个通讯录app(开源地址),每次登陆时,针对每个用户,如果头像图片不在本地,则生成一个异步下载任务(AsyncTask)。

tips:判断图片是否在本地,咱使用的方法:

根据该图片的url,比如 http://images0.cnblogs.com/blog2015/339868/201507/230955108345303.png

截取com之后的字符串,则本地的地址是:app的包名/files/blog2015/339868/201507/230955108345303.png

然后根据文件对象的exists()方法进行判断。

实际使用上,通讯录大概400来人,400多个AysncTask,然后大量并发的File.exists() IO请求,导致下载的那几秒非常的卡,fps低的和放幻灯片一样。

实在是接受不了啊。

优化方案版本1.0:

1:不用AsyncTask,引入固定线程池,控制最高线程并发数5个。

2:不用File.exists()判断图片是否存在,在sqlite里面创建一个图片索引表,select 这个网络地址是否存在;一旦图片写入本地成功,将网络地址和本地地址插入到图片索引表中。

结果:效果立竿见影,fps一下就爬上去了。

新的需求1:

用户肯定是需要他看到的头像优先展示,才不等你后台所有图片下载完嘞!

优化方案版本1.1:

针对同个图片资源的网络请求,咱把这请求的意图划分为1:下载本地 2:加载展示

加载展示的优先级最高,在栈的最顶端,每次push进去之后,都要判断,是否该url已经存在于请求列表了(无论是下载还是加载)

如果已经存在,则把同资源老的请求统统删除掉,并且Push进去之后,确保新任务在栈顶。

tips:加载是有可能重复的哦,比如网络比较慢,用户来回滑动列表会反复触发加载事件,所以加入前要删除该url老的请求

如图

新的需求2:

大家都知道通讯录右侧的字母列表是可以快速导航到拼音匹配的姓氏,如果你首次快速来回滑动的话,还是会略微感到卡顿。

虽然咱在每次加载图片之后,被动都会把该bitmap放入到缓存中,但是首次在字母列表滑动的话,还是会卡的。

优化方案版本1.2:

会卡顿是因为IO请求太频繁了,我们知道内存缓存比磁盘缓存速度要快得多,所以最好在使用的时候,主动提前把用到的头像Bitmap放到内存缓存中。

内存缓存类型 LruCache<String,Bitmap> ;LruCache详解;咱们只要知道这个类型是一个固定大小的内存,使用Lru算法,当容量满了之后,会把不常用的元素给删掉。

String参数代表http地址,Bitmap代表改地址对应的图像数据。

还记得优化方案1.0里面提供的图片索引表吗?

我们在请求栈的底部加入一个指令线程,执行到该线程时就会遍历图片索引表。

针对每个http地址,如果不在内存缓存中,就往请求栈添加一个加载本地图片到内存的线程。

这就是最终版思路了,具体还有一些细节请参考源码实现

android 列表图片优化经历的更多相关文章

  1. Android中图片优化之webp使用

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有关图片的优化,通常我们会用到LruCache(使用强引用.强 ...

  2. Android中图片优化

    1.对图片进行压缩:建议使用TinyPNG工具压缩 2.WebP格式(支持4.0以上)可减少文件大小 3.尽量使用NinePatch的PNG 4.图片缓存

  3. Android APP内存优化之图片优化

    网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的 ...

  4. android开发中图片优化步骤

    android开发中图片优化方法 1.图片加载方法,方便用户加载图片 /*** * 加载本地图片 * @param context:主运行函数实例 * @param bitAdress:图片地址,一般 ...

  5. Android RecyclerView使用 及 滑动时加载图片优化方案

    1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...

  6. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

  7. Android代码内存优化建议-OnTrimMemory优化

    原文  http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...

  8. Android APP 性能优化的一些思考

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  9. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

随机推荐

  1. 深入理解JS之Scope链

    JS被很多人认为是『拙劣的语言』,被这门语言里的各种离奇的事情整的团团转,这篇文章主要来讲讲JS中的Scope链,其主要是影响JS中的变量作用域. 注:本文适合稍有一定JS基础的同学 目录: 初步认识 ...

  2. 通过HttpWebRequest在后台对WebService进行调用

    目录: 1 后台调用Webservice的业务需求 2 WebService支持的交互协议 3 如何配置WebService支持的协议 4 后台对WebService的调用 4.1 SOAP 1.1 ...

  3. Eclipse导入MyEclipseproject(web项目显示为java项目解决的方法)

    在直接Import MyEclipse的项目文件导入到Eclipse之后,须要在项目所放的workspace内改动引入项目文件夹下的.project文件,改动例如以下: 1.在eclipse中新建一个 ...

  4. __init__()

    __init__() 是类的内置方法,用于初始化类的内部状态,当我们去实例化一个对象的时候,默认就会执行 __init__() 下面的语句,例子如下: #!/usr/bin/env python #- ...

  5. ORA-01078错误解决办法

    ORA-01078: failure in processing system parameters & LRM-00109: could not open parameter file 安装 ...

  6. JsBridge的异步不执行的处理--promise异步变同步

    Hybird App:H5内嵌APP,前端用vue,APP之间的交互处理,适配安卓ios, 为了降低开发成本,减少前端适配工作量,三端统一使用  WebViewJavascriptBridge 在进行 ...

  7. 利用jsPerf优化Web应用的性能

    在前端开发的过程中,掌握好浏览器的特性进行有针对性的性能调优是一项基本工作,jsperf.com是一个用来发布基于HTML的针对性能比较的测试用例的网站,你可以在jsPerf上在线填写和运行测试用例, ...

  8. 纯CSS序列号

    per-Css-ol .ol { cursor:pointer; list-style-type: none; counter-reset: sectioncounter; } .ol li:befo ...

  9. 巨蟒python全栈开发-第11阶段 devops-git&&openpyxl2

    大纲 1.git分支 2.git tag 3.git 忽略文件 4.正则表达式 5.openpyxl写数据 6.openpyxl读数据 1.git分支 2.git tag 3.git 忽略文件 4.正 ...

  10. java项目规范

    一.命名规范 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{} 4. 变量 ...