先上个优化之后的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地址,如果不在内存缓存中,就往请求栈添加一个加载本地图片到内存的线程。

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

转载于:https://www.cnblogs.com/kimmy/p/4670065.html

android 列表图片优化经历相关推荐

  1. android 多图片优化工具,总结Android App内存优化之图片优化

    前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在 ...

  2. android复杂列表滑动卡顿,Android 列表滑动性能优化总结

    列表滑动性能优化是一个老生常谈的问题,最近在做项目的时候又遇到了列表滑动卡顿的问题,我在经过多次思考和尝试后,终于找到了滑动卡顿的元凶,于是将经验总结下来. ViewHolder 先说说最常规的Vie ...

  3. 从原生到黑科技:闲鱼 Flutter 图片优化经历了什么?

    简介:阿里妹导读:图片加载是 APP 最常见也最基本的功能,也是影响用户体验的因素之一.在看似简单的图片加载背后却隐藏着很多技术难题.本文介绍闲鱼技术团队在 Flutter 图片优化上所做的尝试,分享 ...

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

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

  5. Android Bitmap图片优化分析

    原文地址:https://juejin.im/post/6844904166138069005 图片在移动开发中占据中举足轻重的地位,早期的android 应用页面Ui相对简单,但随着Android系 ...

  6. Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

    前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...

  7. Android应用性能优化之优化列表头像过度绘制[一]

    为什么80%的码农都做不了架构师?>>>    操作的是否顺畅.卡顿,决定着整体的流畅程度. 事实上android跟iphone的差别,个人觉得很大程度上决定于流畅程度,无论是动画, ...

  8. Android内存优化之图片优化

    关于图片优化,大概如下 为什么要进行图片优化 相信大概刚开始学习Android的时候有过图片过大而直接报错的情况,下面简单介绍一下OOM问题,Android支持的图片格式及图片优化的几种方式 什么是O ...

  9. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

最新文章

  1. MVC系列1-MVC基础
  2. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
  3. RAC环境下的备份与恢复(一)
  4. sqlplus可以连接plsql连接不上_为什么有的iPhone/iPad连接不上电脑?
  5. JavaScript 解决浮点值运算Bug
  6. fedora下安装pps
  7. Linux下安装MySQL数据库、禅道
  8. 拓端tecdat|R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
  9. win7系统架设传奇的简单办法
  10. MT6573 1048MP 版本发布(笔记)
  11. python eof是什么_EOF错误python
  12. OpenCV3.4.x移植到嵌入式ARM板
  13. 计算机网络-第1章-PPT
  14. Java中的日期与时间
  15. 追忆似水流年,似水高三
  16. 论文笔记:Dynamic GCN: Context-enriched Topology Learning for Skeleton-based Action Recognition
  17. SYS.MON_MODS$、SYS.MON_MODS_ALL$和DBA_TAB_MODIFICATIONS
  18. 关于web中的颜色表示方法,你知道多少?
  19. 使用微信web开发者工具调试接口数据【开发记录】
  20. php错误报告和调试

热门文章

  1. 松下NPM服务器怎么备份系统,松下NPM基本操作手册与教程
  2. Java操作itext,寻找给定关键字,并且进行页面抽取和页面盖章两个操作
  3. mysql 升序_MySQL“自古以来”都有一个神秘的HANDLER命令
  4. 95-36-020-ChannelHandler-ChannelHandler
  5. 【Flink】Flink Kafka 消费卡死 消费组卡死 topic无写入 实际有数据 topic正常
  6. 1.1.0-简介-P12-分布式锁的解决方案(二)
  7. 【clickhouse】clickhouse 如何实现tcp方式发送数据
  8. 【Redis】redis JedisDataException: ERR Client sent AUTH, but no password is set
  9. 【Spark】Spark ListenerBus 和 MetricsSystem 体系分析
  10. 【FastJson】FastJson一个Bug java.util.LinkedHashMap cannot be cast to com.alibaba.fastjson.Jsonobject