Smart-image通过SoftReference提高性能
文章导读:
文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人就是从源码的角度来解析它们的实现机制. 它属于github中的开源项目, 开源直接在github中搜索下载即可.
Android的smart-image图片显示插件为了提高性能使用了一、二级缓存, 其中一级缓存也就是内存级缓存采用的就是SoftReference,本章我们来分析下它的源码实现. 由于源码分析本身比较复杂,类与类之间调用关系比较复杂.建议有时间的同学还是看视频.文章最后附上一张完成的源码调用关系图. 在分析之前我们先看下结果.
首先我们说明下几个类之间的关系, 下面仅仅列出来了核心代码, 详细关系可以查看文件底部的关系图, 或者视频教程
- SmartImageView 继承了ImageView 主要是对父类进行了功能增强,用来显示下载的图片
- WebImage 里面的getBitmapFromUrl(String url) 方法主要是来完成文件下载的功能.但是在下载之前需要在一二级缓存进行判断.如果没有才到网络下载
- WebImageCache 用名称也可以看出来,一二级缓存的实现类,其中一级缓存采用的就是SoftReference,二级缓存是硬盘级缓存
WebImage 中读取缓存的代码如下:

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

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

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

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

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

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

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

三个类与类之间的关系图如下(图片另存为到本地可以放大观看)
Smart-image通过SoftReference提高性能的更多相关文章
- 05_Smart-image通过SoftReference提高性能
文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...
- SQL Server 性能优化之——系统化方法提高性能
SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...
- ASP.NET MVC之如何看待内置配置来提高性能优化(四)
前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
- 对于大批量赋值功能,使用if判断是否能提高性能
场景: 如果对某变量进行赋值,是否需要判断一下,如果相等就不用赋值,这样会不会提高性能. 代码如下: "; "; , x2=, x3=; Stopwatch w = new Sto ...
- Java编程提高性能时需注意的地方
1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资 ...
- 使用C# yield关键字来提高性能和可读性
对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量.我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子. 为了让你对yield有一些快速概览 ...
- 使用WITH AS提高性能简化嵌套SQL(转载)
使用WITH AS提高性能简化嵌套SQL http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html
- Java 编程:如何提高性能?(简单总结篇)
开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系 ...
随机推荐
- 【JS】第一个js示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【python】递归(阶乘、斐波纳契、汉诺塔)
- java显示目录文件列表和删除目录
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- apache故障处理
注意:修改虚拟机主机html路径不需要修改主配置这一行. DocumentRoot "/var/www" 1.Permission denied: [client 10.10.2. ...
- 链表创建和链表遍历算法的演示_C语言
今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...
- mysql 先分组在排序
mysql语句的语法模板: select distinct <select_list> from <left_table><join_type> join < ...
- ArcGIS 网络分析[4] 网络数据集深入浅出之连通性、网络数据集的属性及转弯要素
前面介绍完了如何创建网络数据集.如何使用网络分析功能,当然还有的读者会迷惑于一些更深层次的问题,比如网络数据集的连通性问题等. 因为不可能面面俱到,我只能挑重点来阐述,我觉得网络数据集的连通性.属性和 ...
- 搭建和测试 Redis 主备和集群
本文章只是自我学习用,不适宜转载. 1. Redis主备集群 1.1 搭建步骤 机器:海航云虚机(2核4GB内存),使用 Centos 7.2 64bit 操作系统,IP 分别是 192.168.10 ...
- curl 命令详解
curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS.f ...
- 阅读MDN文档之层叠与继承(二)
目录 The cascade Importance Specificity Source order A note on rule mixing Inheritance Controlling inh ...