UniversalImageLoader源码解读03-一些无关紧要的小类

来源:互联网 发布:阿里云wdcp控制面板 编辑:程序博客网 时间:2024/05/05 12:14

    在继续向下解读源码之前,我想介绍一下一些无关紧要的小类,这些类对于理解源码的主干帮助并不大,但是,了解这些类做到心中有数,对于源码的阅读速度是至关重要的。笔者就是通过阅读这些无关紧要的小类开始,逐步深入到主干。

1,一些listener ,在com.nostra13.universalimageloader.core.listener包下, 主要的作用是监听图片的加载,以及控制图片的加载

如果你使用的还算熟练,那么下面的接口你一定熟悉:

public interface ImageLoadingListener {void onLoadingStarted(String imageUri, View view);void onLoadingFailed(String imageUri, View view, FailReason failReason);void onLoadingComplete(String imageUri, View view, Bitmap loadedImage);void onLoadingCancelled(String imageUri, View view);}

如果你是高级一点的使用者,那么下面的类你也一定熟悉,这是框架给我们的福利, 用来优化滑动过程中图片的加载, 不想解释,先简单看注释

public class PauseOnScrollListener implements OnScrollListener {private ImageLoader imageLoader;private final boolean pauseOnScroll;private final boolean pauseOnFling;private final OnScrollListener externalListener;public PauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {this(imageLoader, pauseOnScroll, pauseOnFling, null);}public PauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling,OnScrollListener customListener) {this.imageLoader = imageLoader;this.pauseOnScroll = pauseOnScroll;this.pauseOnFling = pauseOnFling;externalListener = customListener;}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) {case OnScrollListener.SCROLL_STATE_IDLE:// 滑动停止后,开始加载图片imageLoader.resume();break;case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸滑动过程中,停止加载图片if (pauseOnScroll) {imageLoader.pause();}break;case OnScrollListener.SCROLL_STATE_FLING:if (pauseOnFling) {imageLoader.pause();// fling 滑动过程中,停止加载图片}break;}if (externalListener != null) {externalListener.onScrollStateChanged(view, scrollState);}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (externalListener != null) {externalListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);}}}

而框架提供的SimpleImageLoadingListener 什么也没干,只是空实现



在com.nostra13.universalimageloader.core.assist下提供了一些辅助小类,一个一个解释

ContentLengthInputStream 内部保存了一个流字节长度,作为输入流的一个代理存在,在BaseImageDownloader里使用, 源码中貌似没有使用这个length

FailReason描述了加载图片失败的原因,这个原因一旦框架加载图片出了问题就会通过ImageLoadingListener传给你,只要你注册这个监听器

FlushedInputStream 处理慢速网络下加载图片的问题,标准方法,深入原因本人未深究,框架会为你处理慢速网络下的加载,读者耐心读完这个系列就会有所了解

ImageScaleType 图片的缩放类型,枚举,代码中英文注释已经很详细了,在此不做过多解释。

ImageSize 保存图片的宽高,并提供缩放等处理操作

LoadedFrom 图片来源类型

QueueProcessingType 这个在这里先说一下,加载图片的操作会被框架包装成一个任务放到一个队列里,会有一个处理的线程来处理,处理线程取任务的方式由这个类定义,有FIFO, LIFO两种方式

ViewScaleType 前面已经说过了


在com.nostra13.universalimageloader.cache.disc.naming 下提供了两个生成图片imageKey的方法,用作磁盘缓存的key

同样,来自于一个接口

public interface FileNameGenerator {/** Generates unique file name for image defined by URI */String generate(String imageUri);}

Md5FileNameGenerator 会根据imageUri算出一个MD5值 HashCodeFileNameGenerator 仅仅根据imageUri的hashCode字符串作为key,笔者推荐前者。

     当你读到这里时,如果你拿着鼠标翻看在eclipse里翻看源码的话,并且细细品读,我想你应该能感觉到举例核心已经不远了。如果读者没有用鼠标跟踪源码,那么效果可能会打折扣



0 0
原创粉丝点击