文章导读:

文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人就是从源码的角度来解析它们的实现机制. 它属于github中的开源项目, 开源直接在github中搜索下载即可.

Android的smart-image图片显示插件为了提高性能使用了一、二级缓存, 其中一级缓存也就是内存级缓存采用的就是SoftReference,本章我们来分析下它的源码实现. 由于源码分析本身比较复杂,类与类之间调用关系比较复杂.建议有时间的同学还是看视频.文章最后附上一张完成的源码调用关系图. 在分析之前我们先看下结果.

首先我们说明下几个类之间的关系, 下面仅仅列出来了核心代码, 详细关系可以查看文件底部的关系图, 或者视频教程

  • SmartImageView 继承了ImageView 主要是对父类进行了功能增强,用来显示下载的图片
  • WebImage 里面的getBitmapFromUrl(String url) 方法主要是来完成文件下载的功能.但是在下载之前需要在一二级缓存进行判断.如果没有才到网络下载
  • WebImageCache 用名称也可以看出来,一二级缓存的实现类,其中一级缓存采用的就是SoftReference,二级缓存是硬盘级缓存

WebImage 中读取缓存的代码如下:

  1. 1 public class WebImage implements SmartImage {
  2. 2 public Bitmap getBitmap(Context context) {
  3. 3 // 如果没有缓存对象,则先创建缓存对象
  4. 4 if(webImageCache == null) {
  5. 5 webImageCache = new WebImageCache(context);
  6. 6 }
  7. 7
  8. 8 // 判断是否有缓存,如果没有缓存则从网络下载,并存储到缓存中
  9. 9 Bitmap bitmap = null;
  10. 10 if(url != null) {
  11. 11 bitmap = webImageCache.get(url);
  12. 12 if(bitmap == null) {
  13. 13 bitmap = getBitmapFromUrl(url);
  14. 14 if(bitmap != null){
  15. 15 webImageCache.put(url, bitmap);
  16. 16 }
  17. 17 }
  18. 18 }
  19. 19
  20. 20 return bitmap;
  21. 21 }
  22. 22 }

如果缓存中没有数据, WebImage通过Http请求下载网络图片:

  1. 1 private Bitmap getBitmapFromUrl(String url) {
  2. 2 Bitmap bitmap = null;
  3. 4 try {
  4. 5 URLConnection conn = new URL(url).openConnection();
  5. 6 conn.setConnectTimeout(CONNECT_TIMEOUT);
  6. 7 conn.setReadTimeout(READ_TIMEOUT);
  7. 8 bitmap = BitmapFactory.decodeStream((InputStream) conn.getContent());
  8. 9 } catch(Exception e) {
  9. 10 e.printStackTrace();
  10. 11 }
  11. 12
  12. 13 return bitmap;
  13. 14 }

WebImageCache用来存储缓存目录的基本配置:

  1. 1 public class WebImageCache {
  2. 2 private static final String DISK_CACHE_PATH = "/web_image_cache/";
  3. 3 // 用来存储一级缓存的软引用
  4. 4 private ConcurrentHashMap<String, SoftReference<Bitmap>> memoryCache;
  5. 5 private String diskCachePath;
  6. 6 private boolean diskCacheEnabled = false;
  7. 7 private ExecutorService writeThread;
  8. 8 }

WebImageCache中通过URL地址在缓存中查找的代码, 选从一级缓存中查找, 如果查找失败则从二级缓存中查找.

  1. 1 public Bitmap get(final String url) {
  2. 2 Bitmap bitmap = null;
  3. 3
  4. 4 // Check for image in memory
  5. 5 bitmap = getBitmapFromMemory(url);
  6. 6
  7. 7 // Check for image on disk cache
  8. 8 if(bitmap == null) {
  9. 9 bitmap = getBitmapFromDisk(url);
  10. 10
  11. 11 // Write bitmap back into memory cache
  12. 12 if(bitmap != null) {
  13. 13 cacheBitmapToMemory(url, bitmap);
  14. 14 }
  15. 15 }
  16. 16
  17. 17 return bitmap;
  18. 18 }

三个类与类之间的关系图如下(图片另存为到本地可以放大观看)

Smart-image通过SoftReference提高性能的更多相关文章

  1. 05_Smart-image通过SoftReference提高性能

    文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...

  2. SQL Server 性能优化之——系统化方法提高性能

    SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...

  3. ASP.NET MVC之如何看待内置配置来提高性能优化(四)

    前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...

  4. CSS性能分析,如何优化CSS提高性能

    不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...

  5. 对于大批量赋值功能,使用if判断是否能提高性能

    场景: 如果对某变量进行赋值,是否需要判断一下,如果相等就不用赋值,这样会不会提高性能. 代码如下: "; "; , x2=, x3=; Stopwatch w = new Sto ...

  6. Java编程提高性能时需注意的地方

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资 ...

  7. 使用C# yield关键字来提高性能和可读性

    对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量.我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子. 为了让你对yield有一些快速概览 ...

  8. 使用WITH AS提高性能简化嵌套SQL(转载)

    使用WITH AS提高性能简化嵌套SQL http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html

  9. Java 编程:如何提高性能?(简单总结篇)

    开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系 ...

随机推荐

  1. JAVA 实现tail -f 日志文件监控功能

    工具: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</ar ...

  2. ABP 用swagger UI测试API报401无权限访问问题

    问题描述: 当我们用swagger UI对Web API 进行测试时报401错误 我们点开GET /api/services/app/Role/GetAll,输入参数 点击Try it out!按钮, ...

  3. C:函数:功能:实现字符数组中所有字母的倒序存放并输出

    前两天小测碰到一道题,建立一个函数,功能:实现字符数组中所有字母的倒序存放并输出,一开始觉得简单跟数字数组差不多,运行一下发现很多格式错误,这些是不必要的错误,现在就来说下,先说一下代码思路:定义一个 ...

  4. BZOJ 4553 Tjoi2016&Heoi2016 序列

    Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...

  5. tp3.2 事务处理

    事务的机制通常被概括为“ACID”原则即原子性(A).稳定性(C).隔离性(I)和持久性(D).  原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行.  稳定性:数据库在事 ...

  6. vue基础学习(二)

    02-01  vue事件深入-传参.冒泡.默认事件 <div id="box"> <div @click="show2()"> < ...

  7. Django_调查问卷

    1.问卷的保存按钮 前端通过ajax把数据发过来后端处理数据,然后返回给前端2.对问卷做答 首先用户进行登录,验证 条件:1.只有本班的学生才能对问卷做答      2.已经参加过的不能再次访问   ...

  8. MySQL如何找到表与表之间的关系?

    如何找到两张表之间的关系? 先站在左表的角度上去找,如果可以找到左表的多个字段可以对应右表的一个字段,那么左表的一个字段foregin key右表的一个字段.一般情况下为id... 2.如果右表的多个 ...

  9. MySQL字符串相关函数学习二

    ① LOWER(str):将字符串转为小写:与此函数具有相同作用的函数有LCASE() 如果参数是小写.数字或其他特殊字符,则返回原数据 ② LEFT(str, len):返回字符串str左边的len ...

  10. alpha rarefaction using qiime

    shannon菌群多样性指数 H=-∑(Pi)(㏑Pi) Pi=样品中属于第i种的个体的比例,如样品总个体数为N,第i种个体数为ni,则Pi=ni/N: 各种之间,个体分配越均匀,H值就越大.如果每一 ...