您的位置:首页 > 移动开发 > Android开发

Android设计一个图片加载框架

2016-10-15 11:21 441 查看
本文不是具体编码去实现一个图片加载的框架,而是从理论上来讲解设计一个图片加载框架的注意事项和涉及的知识点,提供一个思路,或者帮助童鞋们应付面试。目前Android 发展至今优秀的图片加载框架太多,例如:Imageloader、Picasso、Glide等等。但是作为程序猿,懂得其中的实现原理还是相当重要的,只有懂得才能更好地使用。于是乎,今天我就简单设计一个网络加载图片框架。主要就是熟悉图片的网络加载机制。

一、简介

一个实用的图片加载框架应该具备以下两个功能:

图片的加载:

包括从不同来源(网络、内存、文件系统等)

支持同步及异步方式

支持对图片的压缩(有效的降低OOM的发生概率)等等;

图片的缓存:

包括内存缓存和磁盘缓存。

下面就围绕着两点来展开。

二、图片加载

不同来源(网络、内存、文件系统等)

根据不同的业务需求和使用场景,我们的应用有时候需要从网络上加载图片,有时候需要从磁盘加载,有时候又希望从内存中直接获取。因此一个完善的图片加载框架应该支持从不同的来源来加载一个图片:

对于网络上的图片,我们可以使用HttpURLConnection来下载并解析;

对于磁盘中的图片,我们可以使用BitmapFactory的decodeFile方法;

对于内存中的图片,则直接使用即可。

支持同步及异步方式

我们先来简单的了解同步与异步的概念:

同步:发出了一个“调用”后,需要等到该调用返回才能继续执行;

异步:发出了一个“调用”后,无需等待该调用返回就能继续执行。

同步加载就是我们发出加载图片这个调用后,直到完成加载我们才继续干别的活,否则就一直等着,同步加载的方法需要外部在子线程中调用;异步加载也就是发出加载图片这个调用后我们可以直接去干别的活。

支持对图片的压缩

关于对图片的压缩,主要的工作是计算出inSampleSize,剩下的细节在下面实现部分我们会介绍。

三、图片缓存

缓存功能对于一个图片加载框架来说是十分必要的,因为从网络上加载图片既耗时耗电又费流量。通常我们希望把已经加载过的图片缓存在内存或磁盘中,这样当我们再次需要加载相同的图片时可以直接从内存缓存或磁盘缓存中获取。

内存缓存

访问内存的速度要比访问磁盘快得多,因此我们倾向于把更加常用的图片直接缓存在内存中,这样加载速度更快,但是内存对于移动设备来说是稀缺资源,因此能够缓存的图片比较少。我们可以选择使用SDK提供的LruCache类来实现内存缓存,这个类使用了LRU算法来管理缓存对象,LRU算法即Least Recently Used(最近最少使用),它的主要思想是当缓存空间已满时,移除最近最少使用(上一次访问时间距现在最久远)的缓存对象。关于LruCache类的具体使用我们下面会进行详细介绍。

磁盘缓存

磁盘缓存的优势在于能够缓存的图片数量比较多,不足就是磁盘IO的速度比较慢。磁盘缓存我们可以用DiskLruCache来实现,这个类不包含在Android SDK中。DisLruCache同样使用了LRU算法来管理缓存,关于它的具体使用我们会在后文进行介绍。

相对来说内存缓存比较简单,而磁盘缓存则复杂的多。磁盘缓存(LruDiskCache)并没有直接提供方法来实现,而是要通过Editor以及Snapshot 来实现对于文件系统的添加以及读取的操作。

1、如果要编码实现图片框架建议参考:

(1)鸿洋大神的blog:Android 框架练成 教你打造高效的图片加载框架

(2)何红辉的专栏:教你写Android ImageLoader框架

2、文章参考:

(1)一起写一个 Android 图片加载框架

(2)Android 图片加载框架的简单设计

3、若对Bitmap的大小计算及inSampleSize计算还不太熟悉,感兴趣的同学请参考这里:

高效加载Bitmap。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: