/*** 加载图片工具类* @author afu**/
public class BitmapUtils implements TaskHandler {/*** 判断任务是否暂停*/private boolean pauseTask = false;/*** 是否取消所有任务*/private boolean cancelAllTask = false;private final Object pauseTaskLock = new Object();/*** Android上下文*/private Context context;private BitmapGlobalConfig globalConfig;private BitmapDisplayConfig defaultDisplayConfig;/// create ////*** * @param context 上下文*/public BitmapUtils(Context context) {this(context, null);}/*** * @param context 上下文* @param diskCachePath 磁盘高速缓存路径*/public BitmapUtils(Context context, String diskCachePath) {if (context == null) {throw new IllegalArgumentException("context may not be null");}this.context = context.getApplicationContext();globalConfig = BitmapGlobalConfig.getInstance(this.context, diskCachePath);defaultDisplayConfig = new BitmapDisplayConfig();}/*** * @param context 上下文* @param diskCachePath 磁盘高速缓存路径* @param memoryCacheSize 内存缓存空间大小*/public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize) {this(context, diskCachePath);globalConfig.setMemoryCacheSize(memoryCacheSize);}/*** * @param context 上下文* @param diskCachePath 磁盘高速缓存路径* @param memoryCacheSize 内存缓存空间大小* @param diskCacheSize 磁盘高速缓存空间大小*/public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize, int diskCacheSize) {this(context, diskCachePath);globalConfig.setMemoryCacheSize(memoryCacheSize);globalConfig.setDiskCacheSize(diskCacheSize);}/*** * @param context 上下文* @param diskCachePath 磁盘高速缓存路径* @param memoryCachePercent 内存缓存百分比*/public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent) {this(context, diskCachePath);globalConfig.setMemCacheSizePercent(memoryCachePercent);}/*** * @param context 上下文* @param diskCachePath  磁盘高速缓存路径* @param memoryCachePercent 内存缓存百分比* @param diskCacheSize 磁盘缓存空间大小*/public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent, int diskCacheSize) {this(context, diskCachePath);globalConfig.setMemCacheSizePercent(memoryCachePercent);globalConfig.setDiskCacheSize(diskCacheSize);} config  配置
/*** 配置默认加载drawable类型资源图片* @param drawable* @return*/public BitmapUtils configDefaultLoadingImage(Drawable drawable) {defaultDisplayConfig.setLoadingDrawable(drawable);return this;}/*** 配置默认加载资源id类型资源图片* @param resId* @return*/public BitmapUtils configDefaultLoadingImage(int resId) {defaultDisplayConfig.setLoadingDrawable(context.getResources().getDrawable(resId));return this;}/*** 配置默认加载图片* @param bitmap bitmap类中的资源图片* @return*/public BitmapUtils configDefaultLoadingImage(Bitmap bitmap) {defaultDisplayConfig.setLoadingDrawable(new BitmapDrawable(context.getResources(), bitmap));return this;}/*** 设置默认加载失败的图片* @param drawable drawable类型的资源图片* @return*/public BitmapUtils configDefaultLoadFailedImage(Drawable drawable) {defaultDisplayConfig.setLoadFailedDrawable(drawable);return this;}/*** 配置默认加载失败图片,加载id类型资源图片* @param resId* @return*/public BitmapUtils configDefaultLoadFailedImage(int resId) {defaultDisplayConfig.setLoadFailedDrawable(context.getResources().getDrawable(resId));return this;}/*** 配置默认加载失败图片,加载Bitmap类型资源图片* @param bitmap* @return*/public BitmapUtils configDefaultLoadFailedImage(Bitmap bitmap) {defaultDisplayConfig.setLoadFailedDrawable(new BitmapDrawable(context.getResources(), bitmap));return this;}/*** 配置默认图片最大宽和高* @param maxWidth 最大宽* @param maxHeight 最大高* @return*/public BitmapUtils configDefaultBitmapMaxSize(int maxWidth, int maxHeight) {defaultDisplayConfig.setBitmapMaxSize(new BitmapSize(maxWidth, maxHeight));return this;}/*** 配置默认位图最大图片参数* @param maxSize 最大图片参数类* @return*/public BitmapUtils configDefaultBitmapMaxSize(BitmapSize maxSize) {defaultDisplayConfig.setBitmapMaxSize(maxSize);return this;}/*** 配置默认图片加载动画* @param animation 动画* @return*/public BitmapUtils configDefaultImageLoadAnimation(Animation animation) {defaultDisplayConfig.setAnimation(animation);return this;}/*** 配置默认自动旋转动画* @param autoRotation* @return*/public BitmapUtils configDefaultAutoRotation(boolean autoRotation) {defaultDisplayConfig.setAutoRotation(autoRotation);return this;}/*** 配置默认是否显示原始图片* @param showOriginal true:显示原始图片,false:将会对图片压缩处理* @return*/public BitmapUtils configDefaultShowOriginal(boolean showOriginal) {defaultDisplayConfig.setShowOriginal(showOriginal);return this;}/*** 配置默认图片配置,传入Bitmap.Config类型* @param config* @return*/public BitmapUtils configDefaultBitmapConfig(Bitmap.Config config) {defaultDisplayConfig.setBitmapConfig(config);return this;}/*** 配置默认显示配置* @param displayConfig* @return*/public BitmapUtils configDefaultDisplayConfig(BitmapDisplayConfig displayConfig) {defaultDisplayConfig = displayConfig;return this;}/*** 配置下载参数* @param downloader* @return*/public BitmapUtils configDownloader(Downloader downloader) {globalConfig.setDownloader(downloader);return this;}/*** 配置默认缓存失效* @param defaultExpiry* @return*/public BitmapUtils configDefaultCacheExpiry(long defaultExpiry) {globalConfig.setDefaultCacheExpiry(defaultExpiry);return this;}/*** 配置默认链接时间超时时间* @param connectTimeout  毫秒单位* @return*/public BitmapUtils configDefaultConnectTimeout(int connectTimeout) {globalConfig.setDefaultConnectTimeout(connectTimeout);return this;}/*** 配置默认读取超时时间* @param readTimeout 毫秒* @return*/public BitmapUtils configDefaultReadTimeout(int readTimeout) {globalConfig.setDefaultReadTimeout(readTimeout);return this;}/*** 配置线程池多少* @param threadPoolSize 线程池数* 此参数没有设置,默认是设置5个核心线程池* @return*/public BitmapUtils configThreadPoolSize(int threadPoolSize) {globalConfig.setThreadPoolSize(threadPoolSize);return this;}/*** 配置内存缓存是否启用,默认是启用的* @param enabled* @return*/public BitmapUtils configMemoryCacheEnabled(boolean enabled) {globalConfig.setMemoryCacheEnabled(enabled);return this;}/*** 配置磁盘缓存功能,默认是启用的* @param enabled* @return*/public BitmapUtils configDiskCacheEnabled(boolean enabled) {globalConfig.setDiskCacheEnabled(enabled);return this;}/*** 配置原始磁盘缓存文件名称* @param fileNameGenerator* @return*/public BitmapUtils configDiskCacheFileNameGenerator(FileNameGenerator fileNameGenerator) {globalConfig.setFileNameGenerator(fileNameGenerator);return this;}/*** 配置位图缓存监听* @param listener* @return*/public BitmapUtils configBitmapCacheListener(BitmapCacheListener listener) {globalConfig.setBitmapCacheListener(listener);return this;}// display  显示
/*** 根据图片路径,显示到具体的View上* @param container 要把图片显示到的View* @param uri 图片路径*/public <T extends View> void display(T container, String uri) {display(container, uri, null, null);}/*** 根据图片路径,显示到具体的View上* @param container 要把图片显示到的View* @param uri 图片路径* @param displayConfig*/public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig) {display(container, uri, displayConfig, null);}/*** 根据图片路径,显示到具体的View上* @param container 要把图片显示到的View* @param uri 图片路径* @param callBack 加载过程回调各种状态*/public <T extends View> void display(T container, String uri, BitmapLoadCallBack<T> callBack) {display(container, uri, null, callBack);}/*** 根据图片路径,显示到具体的View上* @param container 要把图片显示到的View* @param uri 图片路径* @param displayConfig 位图显示配置* @param callBack*/public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack) {if (container == null) {return;}if (callBack == null) {callBack = new DefaultBitmapLoadCallBack<T>();}if (displayConfig == null || displayConfig == defaultDisplayConfig) {displayConfig = defaultDisplayConfig.cloneNew();}// Optimize Max SizeBitmapSize size = displayConfig.getBitmapMaxSize();displayConfig.setBitmapMaxSize(BitmapCommonUtils.optimizeMaxSizeByView(container, size.getWidth(), size.getHeight()));container.clearAnimation();if (TextUtils.isEmpty(uri)) {callBack.onLoadFailed(container, uri, displayConfig.getLoadFailedDrawable());return;}// start loading
        callBack.onPreLoad(container, uri, displayConfig);// find bitmap from mem cache.Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri, displayConfig);if (bitmap != null) {callBack.onLoadStarted(container, uri, displayConfig);callBack.onLoadCompleted(container,uri,bitmap,displayConfig,BitmapLoadFrom.MEMORY_CACHE);} else if (!bitmapLoadTaskExist(container, uri, callBack)) {final BitmapLoadTask<T> loadTask = new BitmapLoadTask<T>(container, uri, displayConfig, callBack);// get executorPriorityExecutor executor = globalConfig.getBitmapLoadExecutor();File diskCacheFile = this.getBitmapFileFromDiskCache(uri);boolean diskCacheExist = diskCacheFile != null && diskCacheFile.exists();if (diskCacheExist && executor.isBusy()) {executor = globalConfig.getDiskCacheExecutor();}// set loading imageDrawable loadingDrawable = displayConfig.getLoadingDrawable();callBack.setDrawable(container, new AsyncDrawable<T>(loadingDrawable, loadTask));loadTask.setPriority(displayConfig.getPriority());loadTask.executeOnExecutor(executor);}}/// cache  缓存相关//*** 清除内存和磁盘缓存*/public void clearCache() {globalConfig.clearCache();}/*** 清除内存缓存*/public void clearMemoryCache() {globalConfig.clearMemoryCache();}/*** 清除磁盘缓存*/public void clearDiskCache() {globalConfig.clearDiskCache();}/*** 根据uri清除内存缓存和磁盘缓存* @param uri*/public void clearCache(String uri) {globalConfig.clearCache(uri);}/*** 根据uri清除内存缓存* @param uri*/public void clearMemoryCache(String uri) {globalConfig.clearMemoryCache(uri);}/*** 根据uri清除磁盘缓存* @param uri*/public void clearDiskCache(String uri) {globalConfig.clearDiskCache(uri);}/*** 刷新缓存*/public void flushCache() {globalConfig.flushCache();}/*** 关闭缓存*/public void closeCache() {globalConfig.closeCache();}/*** 根据uri从磁盘缓存得到位图文件* @param uri* @return*/public File getBitmapFileFromDiskCache(String uri) {return globalConfig.getBitmapCache().getBitmapFileFromDiskCache(uri);}/*** 根据uri和位图显示配置从磁盘缓存得到位图文件* @param uri* @param config* @return*/public Bitmap getBitmapFromMemCache(String uri, BitmapDisplayConfig config) {if (config == null) {config = defaultDisplayConfig;}return globalConfig.getBitmapCache().getBitmapFromMemCache(uri, config);}// tasks  任务//
/*** 支持暂停*/@Overridepublic boolean supportPause() {return true;}/*** 支持重新开始*/@Overridepublic boolean supportResume() {return true;}/*** 支持取消*/@Overridepublic boolean supportCancel() {return true;}/*** 暂停*/@Overridepublic void pause() {pauseTask = true;flushCache();}/*** 刷新*/@Overridepublic void resume() {pauseTask = false;synchronized (pauseTaskLock) {pauseTaskLock.notifyAll();}}/*** 取消*/@Overridepublic void cancel() {pauseTask = true;cancelAllTask = true;synchronized (pauseTaskLock) {pauseTaskLock.notifyAll();}}/*** 是否暂停*/@Overridepublic boolean isPaused() {return pauseTask;}/*** 是否是取消了*/@Overridepublic boolean isCancelled() {return cancelAllTask;}下面这些方法是否没有提供给开发者使用的///
@SuppressWarnings("unchecked")private static <T extends View> BitmapLoadTask<T> getBitmapTaskFromContainer(T container, BitmapLoadCallBack<T> callBack) {if (container != null) {final Drawable drawable = callBack.getDrawable(container);if (drawable instanceof AsyncDrawable) {final AsyncDrawable<T> asyncDrawable = (AsyncDrawable<T>) drawable;return asyncDrawable.getBitmapWorkerTask();}}return null;}private static <T extends View> boolean bitmapLoadTaskExist(T container, String uri, BitmapLoadCallBack<T> callBack) {final BitmapLoadTask<T> oldLoadTask = getBitmapTaskFromContainer(container, callBack);if (oldLoadTask != null) {final String oldUrl = oldLoadTask.uri;if (TextUtils.isEmpty(oldUrl) || !oldUrl.equals(uri)) {oldLoadTask.cancel(true);} else {return true;}}return false;}public class BitmapLoadTask<T extends View> extends PriorityAsyncTask<Object, Object, Bitmap> {private final String uri;private final WeakReference<T> containerReference;private final BitmapLoadCallBack<T> callBack;private final BitmapDisplayConfig displayConfig;private BitmapLoadFrom from = BitmapLoadFrom.DISK_CACHE;public BitmapLoadTask(T container, String uri, BitmapDisplayConfig config, BitmapLoadCallBack<T> callBack) {if (container == null || uri == null || config == null || callBack == null) {throw new IllegalArgumentException("args may not be null");}this.containerReference = new WeakReference<T>(container);this.callBack = callBack;this.uri = uri;this.displayConfig = config;}@Overrideprotected Bitmap doInBackground(Object... params) {synchronized (pauseTaskLock) {while (pauseTask && !this.isCancelled()) {try {pauseTaskLock.wait();if (cancelAllTask) {return null;}} catch (Throwable e) {}}}Bitmap bitmap = null;// get cache from disk cacheif (!this.isCancelled() && this.getTargetContainer() != null) {this.publishProgress(PROGRESS_LOAD_STARTED);bitmap = globalConfig.getBitmapCache().getBitmapFromDiskCache(uri, displayConfig);}// download imageif (bitmap == null && !this.isCancelled() && this.getTargetContainer() != null) {bitmap = globalConfig.getBitmapCache().downloadBitmap(uri, displayConfig, this);from = BitmapLoadFrom.URI;}return bitmap;}public void updateProgress(long total, long current) {this.publishProgress(PROGRESS_LOADING, total, current);}private static final int PROGRESS_LOAD_STARTED = 0;private static final int PROGRESS_LOADING = 1;@Overrideprotected void onProgressUpdate(Object... values) {if (values == null || values.length == 0) return;final T container = this.getTargetContainer();if (container == null) return;switch ((Integer) values[0]) {case PROGRESS_LOAD_STARTED:callBack.onLoadStarted(container, uri, displayConfig);break;case PROGRESS_LOADING:if (values.length != 3) return;callBack.onLoading(container, uri, displayConfig, (Long) values[1], (Long) values[2]);break;default:break;}}@Overrideprotected void onPostExecute(Bitmap bitmap) {final T container = this.getTargetContainer();if (container != null) {if (bitmap != null) {callBack.onLoadCompleted(container,this.uri,bitmap,displayConfig,from);} else {callBack.onLoadFailed(container,this.uri,displayConfig.getLoadFailedDrawable());}}}@Overrideprotected void onCancelled(Bitmap bitmap) {synchronized (pauseTaskLock) {pauseTaskLock.notifyAll();}}public T getTargetContainer() {final T container = containerReference.get();final BitmapLoadTask<T> bitmapWorkerTask = getBitmapTaskFromContainer(container, callBack);if (this == bitmapWorkerTask) {return container;}return null;}}
}

转载于:https://www.cnblogs.com/yangguangfu/p/4518596.html

xUtils 中的BitmapUtils 全面注释相关推荐

  1. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解 一.注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快 ...

  2. IDEA中多行注释及取消注释的快捷键分享

    这篇文章主要介绍了IDEA中多行注释及取消注释的快捷键分享,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.一次性添加多行注释的快捷键 首先选中要注释区域,然后 ctrl+/ 这个 ...

  3. 如何在 IntelliJ IDEA 中快速生成 JavaDoc 注释模板

    如何在 IntelliJ IDEA 中快速生成 JavaDoc 注释模板 此博客存在上一个版本,如果读者对笔者以前版本的博客依然感兴趣,可以访问此链接:https://blog.csdn.net/wa ...

  4. xml分析错误:注释未终止_错误:C中的未终止注释(无效的注释块) 常见的C程序错误...

    xml分析错误:注释未终止 Comments are used to write logic explain or anything that you do not want to compile. ...

  5. Eclipse中java文件头注释格式设置

    2019独角兽企业重金招聘Python工程师标准>>> Eclipse中java文件头注释格式设置 Eclipse中java文件头注释格式设置 windows->prefere ...

  6. Pycharm中对代码进行注释和缩进

    Pycharm中对代码进行注释和缩进 一.注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快捷键:Ctr ...

  7. mysql中的四种注释

    mysql中的四种注释 NO1:-- 注释内容 这种注释方法不能够实现多行注释,要注意的是 --后面是有一个空格的.(-- 后面的内容将不会被识别,因此需要在下一行加上分号来结束该语句) NO2:#注 ...

  8. 怎么解决缺少java.doc_阿里代码规范检测中方法缺少javadoc注释怎么办

    阿里代码规范检测中方法缺少javadoc注释怎么办 发布时间:2020-08-12 15:01:48 来源:亿速云 阅读:204 作者:小新 这篇文章给大家分享的是有关阿里代码规范检测中方法缺少jav ...

  9. 代码中超魔性图片注释

    代码中超魔性图片注释 马儿 _(\_/) ,((((^`\(((( (6 \ ,((((( , \,,,_ ,((((( /"._ ,`,((((\\ ,... ,(((( / `-.-') ...

  10. 下面哪种不是java语言的注释写法_下列哪项不是Java语言中所规定的注释样式?()...

    [单选题]下列声明和赋值语句错误的是() [单选题]Java语言中表达式"11"+22的结果是() [单选题]以下表达式语句不合法的是() [判断题]3. 教育活动是在教师有目的. ...

最新文章

  1. [跟我学UML] UML类图中的泛化
  2. Android实现自动清空,android – 删除图像后自动刷新在gridview中不...
  3. oracle asm盘符变了,使用multipath创建ASM磁盘的奇怪现象
  4. G - Caesar Cipher Gym - 102798G
  5. python数据挖掘与机器学习实战_Python数据挖掘与机器学习技术入门实战(1)
  6. Typora markdown公式换行等号对齐_Typora编写博客格式化文档的最佳软件
  7. 单片机的模拟智能灌溉系统
  8. 本周计划(4月12日-19日)
  9. linux opencv移植教程,OpenCV在Ubuntu和Linux系统下的移植
  10. 3D旋转(CSS3)
  11. 特稿:OceanBase 连破纪录的背后,是技术人的砥砺前行 | 凌云时刻
  12. javaweb的热部署
  13. 大众点评后端项目解析
  14. java word转pdf 在linux转pdf乱码解决方法
  15. 北大200页元宇宙报告!六大板块,看20家巨头的元宇宙布局 | 智东西内参
  16. requests 模块获取免费的代理并检测代理 IP 是否有效!
  17. IMO 开放平台单点登录
  18. 学渣笔记——Java常用基本数据类型
  19. 一篇关于编程的文章,启发你的编程知识
  20. python对数据分组的方法

热门文章

  1. redis主从和集群搭建
  2. 快捷添加请求头的方法
  3. [转]在一个工程中添加别的工程的中已创建好的对话框资源。
  4. so文件(1)简单的导出使用
  5. python学习点滴记录-Day01
  6. 51nod 1577 线性基
  7. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
  8. logrotate日志轮转配置文档
  9. JS的作用域和作用域链
  10. 直关的sql 联级更新语句