Android教程示例BitmapFun分析

来源:互联网 发布:手机破解软件论坛 编辑:程序博客网 时间:2024/05/02 00:25

转载自:http://blog.csdn.net/xu_fu/article/details/8269865

Google为Android开发提供了一个培训教程,在加载图片一节中提供了示例程序BitmapFun,实现了图片下载、缓存、解析加载的功能,具体分析如下:

1、程序介绍


     程序整体结构如上图所示,应用启动后进入ImageGridActivity,首先会加载一个GridView,该gridview根据预先设定好的URL(在Images.java中,这个类就存了些URL,其他什么也没有,恩)从服务器上下载缩略图资源显示,点击某个缩略图后会转到ImageDetailActivity,里面是一个ViewPager,用于显示相应的大图,相应的大图一开始也会从服务器上下载,之后会缓存到本地,缩略图也是这样。

2、具体分析

1)Images.java

该类只用来提供数据地址,里面有两个String的数组,分别存放了缩略图与大图的请求地址。


2)在UI包中包含了两个Activity->ImageGridActivity和ImageDetailActivity,他们分别加载GridView与ViewPager,对应到ImageGridFragment和ImageDetailFragment,他们会在相应的Adapter中通过getView请求图片进行loadBitmap操作,这里就用到了后面util包中的各个类。总体流程都是先在缓存中找,缓存中没有就从服务器下载;缓存又分为内存缓存和硬盘缓存,内存中没有就到硬盘中找。

3)ImageWorker、ImageResizer、ImageFetcher

这三个类提供了图片加载与处理的操作,他们的关系如下:



ImageWork是一个抽象类,是这三个类的基础,loadImage()方法为外部提供了一个加载图片的统一接口,其中具体的加载过程通过一个异步类来后台执行,异步类又会调用processBitmap()方法。在这里ImageWork没有实现该方法,因为图片的加载方式有多种,包括网络下载,从resources中解析和本地文件解析等,因此把它定义为一个抽象方法,具体的实现由子类来决定(也就是传说中的工厂模式)。在该类中还包含了缓存管理ImageCache的引用,内部类CacheAsyncTask异步调用closeCache等方法管理硬盘缓存。

ImageResizer继承自ImageWork,定义了几种图片解析方法和一个采样参数计算方法。就像类名所表示的,该类主要是在父类ImageWork的基础上,根据传入的要求长宽对图片进行缩放,也就是resize。类中实现了processBitmap()方法,选了一种图片解析方式,即根据resID解析resources下的图片。如果想换其他的解析方式,只要定义一个子类覆写该方法即可。后面会看到子类ImageFecher覆写了该方法,根据该应用需要选择了从本地文件中解析图片。

ImageFecher继承自ImageResizer,又添加了一个网络操作和网络图片的硬盘缓存httpDiskCache设置,clearCacheInternal等方法覆写了ImageWork的该方法,添加了对httpDishCache的处理。

        到这里对图片加载和处理的功能就定义好了,后面在实际的调用中只使用ImageFecher这个全功能类。

4)ImageCache

该类主要用来处理图片缓存这个事,内部有内存缓存mLruCache和硬盘缓存mDiskLruCache,addBitmapToCache()将图片进行缓存,通过get方法可以分别从内存和硬盘中获取图片,后面还定义了一些特定功能的方法。

ImageCacheParams是个内部类,里面包含了一系列的缓存参数,像缓存大小、图片压缩格式、缓存使能等。使用ImageCache的时候需要首先实例化该参数类,调整了各个参数后传入ImageCache的构造函数。

还有一个RetainFragment内部类,用于存储一个ImageCache的引用,就这一个功能。

3、实例化流程


上图是使用缓存时的具体调用时序图,主要是缓存的初始化过程。



原创粉丝点击