背景:在咱编写的图片处理模块里,针对加载这个方法,参数很多,如:
/** * 加载图片,经过内存、磁盘、两层缓存如果还没找到,则走http访问网络资源 * @param url 地址 * @param imageView 图片控件 * @param width 图片宽度 * @param height 图片高度 * @param cacheType 缓存类型 * @param workType 队列优先级 * @param placeHolder 占位图片 * @param canQueryHttp 是否可以走流量获取图片 */ private void load(String url, ImageView imageView, int width, int height, CacheType cacheType, ImageTaskManager.WorkType workType, int placeHolder, boolean canQueryHttp) { }
咱们当然可以用 重载 提供很多个版本,应付项目里面的需要。
但是我们可以用Builder(构造器)模式,提供一种更加优雅易用的访问方式。
事实上,很多android上优秀的开源图片框架都用了这种方式,如picasso,universalImageLoader等
先给上优化后,咱们调用加载方法的方式:
ZImage.ready().want(entity.getIconUrl()).reSize(mImgSize, mImgSize).into(newsIcon);
全部的参数如下:
ZImage.ready().want("请求地址").reSize(图片尺寸).cache(缓存方式).canQueryByHttp(是否可以走流量访问图片).lowPriority(将请求放到栈的底部).empty(图片占位符).into(图片控件);
接下来简单说下,咱是如何简单用构造器模式重构图片功能模块的:
1:新建一个类RequestCreator, 将load方法的参数抽取出来作为其属性
2:针对每个属性的赋值方法,返回this,这样就可以保证每次赋值后,可以获得对象继续赋值
/** * 缓存 * * @param cacheType 缓存类型 * @return */ public RequestCreator cache(CacheType cacheType) { this.cacheType = cacheType; return this; }
3:增加一个方法,将类里面的属性,作为参数传递到load方法里
/** * 载入图片到控件 * * @param imageView */ public void into(ImageView imageView) { mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp); }
4:在现有图片功能类里面,添加一个want方法,返回RequestCreator。
/** * 构造器起手式,从一个资源开始 * * @param url * @return */ public RequestCreator want(String url) { return new RequestCreator(url); }
完
给上完整的构造器的类,各位可以参考下,完整的图片模块请参考本人的项目源码
/** * 请求构造器 */ public class RequestCreator { /** * 请求地址 */ String url; /** * 优先级,默认后进先出 */ ImageTaskManager.WorkType priority = ImageTaskManager.WorkType.LIFO; /** * 占位图 */ int placeHolder = -1; /** * 缓存类型,默认内存缓存,基于LRU算法,不用担心内存爆炸 */ CacheType cacheType = CacheType.DiskMemory; /** * 图片的宽度 */ int width = mBaseApp.getScreenWidth(); /** * 图片的高度 */ int height = mBaseApp.getScreenHeight(); /** * 能否通过http请求网络数据 */ boolean canQueryByHttp = true; public RequestCreator(String url) { this.url = url; this.canQueryByHttp = mBaseApp.canRequestImage(); } /** * 占位图 * * @param resID 本地图片资源 R.drawable. * @return */ public RequestCreator empty(int resID) { placeHolder = resID; return this; } /** * 缓存 * * @param cacheType 缓存类型 * @return */ public RequestCreator cache(CacheType cacheType) { this.cacheType = cacheType; return this; } /** * 优先级,默认后进先出。使用本方法降低优先级 * * @return */ public RequestCreator lowPriority() { priority = ImageTaskManager.WorkType.LILO; return this; } /** * 对图片尺寸进行缩放,节约内存 * * @param width 图片宽度,默认屏幕宽度 * @param height 图片高度,默认屏幕高度 * @return */ public RequestCreator reSize(int width, int height) { this.width = width; this.height = height; return this; } public RequestCreator canQueryByHttp(boolean canQueryByHttp) { this.canQueryByHttp = canQueryByHttp; return this; } /** * 载入图片到控件 * * @param imageView */ public void into(ImageView imageView) { mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp); } /** * 下载图片 */ public void save() { if (DBHelper.cache().exist(url)) return; ImageTaskManager.getInstance().addTask(new SaveImageTask(mBaseApp, url, width, height), priority); } }