一、 本文由来:

让更多的人审核和发现BUG,一直是本人所崇尚的目标。经历了5年的发展,Android中也有很多质量很高的开源项目。UnversalImageLoader(统一图片缓存加载库),目前最流行功能最强大的图片缓存库。本文致力于在学习中挖掘和探讨其代码和设计,或者说这是介绍怎样建设一个受欢迎的库。

项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

 

二、功能以及设计:

良好的接口,丰富的核心,强大的扩展。

Imageloader对外接口使用了java工具类非常常见的单例模式,获取单例对象之后,调用displayImage方法就可以对一个已存在的ImageView加载一个远程URL图片

不难发现这也是门面模式一个很好的应用,将逻辑和控制置于ImageloaderEngine中,自己保存了配置对象ImageLoaderConfiguration

类关系如下:



  

在使用Imageloader去显示图片之前,必须先调用初始化方法init(),传入一个配置对象.初始化代码示例:



  

这又是熟悉的建造者模式。Imageloader的配置和默认显示的配置都是通过Builder模式构建起来。通过研究内部实现可以发现,没有设置的选项,都会使用库本身默认的配置。

 

ImageloaderEngine类是库的核心,负责调度各个模块,这又是一个中介者模式。

ImageloaderEngine类中聚合了Task对象,LoadAndDisplayProgressAndDisplay的任务,根据名字就可以知道其功能。类关系如下:



  

ProgressAndDisplayTask相比LoadAndDisplay多了一个显示加载中图片的功能,只是在LoadAndDisplay之前多做了一步设置加载中图片的操作。

以下是LoadandDisplayTask的类关系视图:



  

如图,LoadAndDisplayTask类根据配置,调用ImageDownloaderImageDecoder进行图片的下载和解码,最后通过DisplayImageOptions中的bitmapDisplayer对象对imageView进行设置图片的操作。当然,这一过程中,不断的通过ImageLoader这个监听对外汇报任务状态。真真切切的观察者模式,一举一动尽在掌握。

到这里主体的框架已经介绍完毕。是否感觉就这么回事,这一流程不就是普普通通的图片缓存库该做的事情么。其实它真正的妙处在于面向接口的设计,如上图,ImageDecoderImageDownloader就只是一个接口关联。并没有关系具体实现类,本库中提供了多种多样的实现类。如图:



  

通过初始化的配置,根据不同的网络状况选择不同的Downloader,自由的拆卸和组合,让人用起来得心应手。

观察上图,或许读者有一个疑问,BitmapDisplayer为何置于DisplayOptions中而不是LoadAndDisplayTask的一部分,这也是作者的一个设计妙处。首先我们回到一开始的接口。

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options,ImageLoadingListener listener);

用户使用这个接口,可以对每一次的加载图片操作进行不同的配置,不同的BitmapDisplayer,库中也提供了多种BitmapDisplayer接口的实现:



  

甚至可以自定义,使用自己实现的BitmapDisplayer,现阶段做的项目就通过实现自定义的Displayer实现了显示图片的怦然心动动画效果。

实现代码如下:



  

 

 

 

三、总结:

UnversalImageLoader中还有许多值得我们学习的地方,譬如多线程中锁ReetranLock类的使用和异常处理。本文的重点是介绍其设计中合理性,技术要点将在新的文档实践和介绍,这里暂不花费篇幅阐述

使用开源库不应该只满足其如何使用,更应该了解并且探究它。我们的目标并不是重复发明轮子,但是发明轮子的能力是必须要有的。

 

一、 Android架构
Android就是包括一个操作系统、中间件和关键应用的移动设备的一个软件堆。
从底层到上层共包括四层:
1、 Linux内核层
Linux操作系统及驱动
2、 系统库和Andriod运行时
系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带,通过JAVA本地调用JNI(Java Native Interface)的接口函数实现和上层之间的通信。
Android运行时包括核心库和Dalvik虚拟机,主要由C和C++实现。
3、 应用框架层
是Android应用开发的基础,主要由Java语言实现,为应用层提供API。应用层框架提供了可以服用的组件,提供了应用开发的规范,屏蔽了应用层和底层交互的复杂性。
4、 应用程序层
核心应用程序包、Java语言设计和编写的应用程序,两者彼此平等、友好共处,同时,开发人员也可以使用自行开发应用程序替换核心应用程序,使手机应用更加灵活和个性化。
在这里插入图片描述

二、 HAL层介绍
1、HAL简介
HAL(Hardware Abstraction Layer 硬件抽象层),处于Linux内核层之上,作用:1). Linux是遵从GPL开源协议,把控制硬件的动作(或者是寄存器直接映射到HAL中)都放到了 Android HAL中,可以避开开源协议。2).在HAL中实现驱动的进一步接口封装,提供给构架层。Android HAL存在的原因主要有:
a) 并不是所有的硬件设备都有标准的linux kernel的接口;
b) KERNEL DRIVER涉及到GPL的版权,某些设备制造商并不愿意公开硬件驱动,所以才去用HAL方式绕过GPL;
c) 针对某些硬件,Android有一些特殊的需求。

一、 Android架构
Android就是包括一个操作系统、中间件和关键应用的移动设备的一个软件堆。
从底层到上层共包括四层:
1、 Linux内核层
Linux操作系统及驱动
2、 系统库和Andriod运行时
系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带,通过JAVA本地调用JNI(Java Native Interface)的接口函数实现和上层之间的通信。
Android运行时包括核心库和Dalvik虚拟机,主要由C和C++实现。
3、 应用框架层
是Android应用开发的基础,主要由Java语言实现,为应用层提供API。应用层框架提供了可以服用的组件,提供了应用开发的规范,屏蔽了应用层和底层交互的复杂性。
4、 应用程序层
核心应用程序包、Java语言设计和编写的应用程序,两者彼此平等、友好共处,同时,开发人员也可以使用自行开发应用程序替换核心应用程序,使手机应用更加灵活和个性化。
在这里插入图片描述

二、 HAL层介绍
1、HAL简介
HAL(Hardware Abstraction Layer 硬件抽象层),处于Linux内核层之上,作用:1). Linux是遵从GPL开源协议,把控制硬件的动作(或者是寄存器直接映射到HAL中)都放到了 Android HAL中,可以避开开源协议。2).在HAL中实现驱动的进一步接口封装,提供给构架层。Android HAL存在的原因主要有:
a) 并不是所有的硬件设备都有标准的linux kernel的接口;
b) KERNEL DRIVER涉及到GPL的版权,某些设备制造商并不愿意公开硬件驱动,所以才去用HAL方式绕过GPL;
c) 针对某些硬件,Android有一些特殊的需求。

        平常用eclipse 进行安卓开发的时候我们会遇到安卓自带的模拟器启动时间过长,反应慢等的问题,这个时候就依托别的安卓模拟器,笔者比较喜欢使用夜神模拟器。
下面来讲讲eclipse连接夜神的步骤

第一步:启动eclipse

在这里插入图片描述

第二步:启动夜神

双击启动之后进行连接

  1. 第一种方法:需要进入夜神模拟器的安装路径bin下启动模拟器的连接 例如我的安装路径
    注意是使用cmd进入该路径下然后运行 nox_adb connect 127.0.0.1:65001

  2. 第二种方法:可以设置快捷方式进行连接,不用每次麻烦进入bin下。
    想要配置可以参照我以前的博文第5条,第5条,第5条!
    博文连接
    https://blog.csdn.net/qq_44333320/article/details/105443875

第三步:开始操作

1.打开eclipse后点击工具栏window——>show view——>Other——>Devices ——>OK,之后就会出现设备 。
在这里插入图片描述
在这里插入图片描述

2.然后右键点击你的项目——>Run As——>Run Configrations——>双击Android application——>New_Configrations
3.然后选择你的项目——>Target,看图操作就OK了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大功告成!
希望对你有帮助!