1 public voiddisplayImage(String uri, ImageAware imageAware, DisplayImageOptions options,2 ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {3 //检测参数有效性

4 checkConfiguration();5 if (imageAware == null) {6 throw newIllegalArgumentException(ERROR_WRONG_ARGUMENTS);7 }8 if (listener == null) {9 listener =defaultListener;10 }11 if (options == null) {12 options =configuration.defaultDisplayImageOptions;13 }14

15 if(TextUtils.isEmpty(uri)) {16 engine.cancelDisplayTaskFor(imageAware);17 listener.onLoadingStarted(uri, imageAware.getWrappedView());18 if(options.shouldShowImageForEmptyUri()) {19 imageAware.setImageDrawable(options.getImageForEmptyUri(configuration.resources));20 } else{21 imageAware.setImageDrawable(null);22 }23 listener.onLoadingComplete(uri, imageAware.getWrappedView(), null);24 return;25 }26

27 if (targetSize == null) {28 targetSize =ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());29 }30 String memoryCacheKey =MemoryCacheUtils.generateKey(uri, targetSize);31 engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);32

33 listener.onLoadingStarted(uri, imageAware.getWrappedView());34

35 //尝试从内存中获取缓存,使用了MemoryCache组件

36 Bitmap bmp =configuration.memoryCache.get(memoryCacheKey);37 if (bmp != null && !bmp.isRecycled()) {38 //若已在内存缓存

39 L.d(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey);40 //如果需要处理,则调用ProcessAndDisplayImageTask.run()Bitmap进行处理

41 if(options.shouldPostProcess()) {42 ImageLoadingInfo imageLoadingInfo = newImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,43 options, listener, progressListener, engine.getLockForUri(uri));44 ProcessAndDisplayImageTask displayTask = newProcessAndDisplayImageTask(engine, bmp, imageLoadingInfo,45 defineHandler(options));46 if(options.isSyncLoading()) {47 //处理Bitmap

48 displayTask.run();49 } else{50 engine.submit(displayTask);51 }52 } else{53 //无需处理Bitmap,则调用BitmapDisplayer组件将bitmap显示在imageAware上

54 options.getDisplayer().display(bmp, imageAware, LoadedFrom.MEMORY_CACHE);55 //回调加载完成

56 listener.onLoadingComplete(uri, imageAware.getWrappedView(), bmp);57 }58 } else{59 //若内存中无该缓存

60 if(options.shouldShowImageOnLoading()) {61 imageAware.setImageDrawable(options.getImageOnLoading(configuration.resources));62 } else if(options.isResetViewBeforeLoading()) {63 imageAware.setImageDrawable(null);64 }65 //封装加载信息

66 ImageLoadingInfo imageLoadingInfo = newImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,67 options, listener, progressListener, engine.getLockForUri(uri));68 //创建LoadAndDisplayImageTask组件

69 LoadAndDisplayImageTask displayTask = newLoadAndDisplayImageTask(engine, imageLoadingInfo,70 defineHandler(options));71 if(options.isSyncLoading()) {72 //从磁盘或网络加载,下面会分析

73 displayTask.run();74 } else{75 engine.submit(displayTask);76 }77 }78 }79

80

81

82 @Override83 public voidrun() {84 if (waitIfPaused()) return;85 if (delayIfNeed()) return;86

87 ReentrantLock loadFromUriLock =imageLoadingInfo.loadFromUriLock;88 L.d(LOG_START_DISPLAY_IMAGE_TASK, memoryCacheKey);89 if(loadFromUriLock.isLocked()) {90 L.d(LOG_WAITING_FOR_IMAGE_LOADED, memoryCacheKey);91 }92

93 loadFromUriLock.lock();94 Bitmap bmp;95 try{96 checkTaskNotActual();97 //尝试从内存获取

98 bmp =configuration.memoryCache.get(memoryCacheKey);99 if (bmp == null ||bmp.isRecycled()) {100 //未在内存缓存,下面将分析tryLoadBitmap

101 bmp =tryLoadBitmap();102 if (bmp == null) return; //listener callback already was fired

103

104 checkTaskNotActual();105 checkTaskInterrupted();106

107 if(options.shouldPreProcess()) {108 L.d(LOG_PREPROCESS_IMAGE, memoryCacheKey);109 bmp =options.getPreProcessor().process(bmp);110 if (bmp == null) {111 L.e(ERROR_PRE_PROCESSOR_NULL, memoryCacheKey);112 }113 }114

115 if (bmp != null &&options.isCacheInMemory()) {116 L.d(LOG_CACHE_IMAGE_IN_MEMORY, memoryCacheKey);117 configuration.memoryCache.put(memoryCacheKey, bmp);118 }119 } else{120 loadedFrom =LoadedFrom.MEMORY_CACHE;121 L.d(LOG_GET_IMAGE_FROM_MEMORY_CACHE_AFTER_WAITING, memoryCacheKey);122 }123

124 if (bmp != null &&options.shouldPostProcess()) {125 L.d(LOG_POSTPROCESS_IMAGE, memoryCacheKey);126 bmp =options.getPostProcessor().process(bmp);127 if (bmp == null) {128 L.e(ERROR_POST_PROCESSOR_NULL, memoryCacheKey);129 }130 }131 checkTaskNotActual();132 checkTaskInterrupted();133 } catch(TaskCancelledException e) {134 fireCancelEvent();135 return;136 } finally{137 loadFromUriLock.unlock();138 }139

140 DisplayBitmapTask displayBitmapTask = newDisplayBitmapTask(bmp, imageLoadingInfo, engine, loadedFrom);141 runTask(displayBitmapTask, syncLoading, handler, engine);142 }143

144

145 private Bitmap tryLoadBitmap() throwsTaskCancelledException {146 Bitmap bitmap = null;147 try{148 //调用DiskCache组件尝试从磁盘获取缓存

149 File imageFile =configuration.diskCache.get(uri);150 if (imageFile != null && imageFile.exists() && imageFile.length() > 0) {151 //若已在磁盘缓存

152 L.d(LOG_LOAD_IMAGE_FROM_DISK_CACHE, memoryCacheKey);153 loadedFrom =LoadedFrom.DISC_CACHE;154

155 checkTaskNotActual();156 //将磁盘文件转换为bitmap对象

157 bitmap =decodeImage(Scheme.FILE.wrap(imageFile.getAbsolutePath()));158 }159 if (bitmap == null || bitmap.getWidth() <= 0 || bitmap.getHeight() <= 0) {160 //若不在磁盘缓存

161 L.d(LOG_LOAD_IMAGE_FROM_NETWORK, memoryCacheKey);162 loadedFrom =LoadedFrom.NETWORK;163

164 String imageUriForDecoding =uri;165 //从网络加载,并放入磁盘缓存,下面分析

166 if (options.isCacheOnDisk() &&tryCacheImageOnDisk()) {167 imageFile =configuration.diskCache.get(uri);168 if (imageFile != null) {169 imageUriForDecoding =Scheme.FILE.wrap(imageFile.getAbsolutePath());170 }171 }172

173 checkTaskNotActual();174 bitmap =decodeImage(imageUriForDecoding);175

176 if (bitmap == null || bitmap.getWidth() <= 0 || bitmap.getHeight() <= 0) {177 fireFailEvent(FailType.DECODING_ERROR, null);178 }179 }180 } catch(IllegalStateException e) {181 fireFailEvent(FailType.NETWORK_DENIED, null);182 } catch(TaskCancelledException e) {183 throwe;184 } catch(IOException e) {185 L.e(e);186 fireFailEvent(FailType.IO_ERROR, e);187 } catch(OutOfMemoryError e) {188 L.e(e);189 fireFailEvent(FailType.OUT_OF_MEMORY, e);190 } catch(Throwable e) {191 L.e(e);192 fireFailEvent(FailType.UNKNOWN, e);193 }194 returnbitmap;195 }196

197

198 private boolean tryCacheImageOnDisk() throwsTaskCancelledException {199 L.d(LOG_CACHE_IMAGE_ON_DISK, memoryCacheKey);200

201 booleanloaded;202 try{203 //下载图片,下面分析

204 loaded =downloadImage();205 if(loaded) {206 int width =configuration.maxImageWidthForDiskCache;207 int height =configuration.maxImageHeightForDiskCache;208 if (width > 0 || height > 0) {209 L.d(LOG_RESIZE_CACHED_IMAGE_FILE, memoryCacheKey);210 resizeAndSaveImage(width, height); //TODO : process boolean result

211 }212 }213 } catch(IOException e) {214 L.e(e);215 loaded = false;216 }217 returnloaded;218 }219

220 private boolean downloadImage() throwsIOException {221 //获取输入流

222 InputStream is =getDownloader().getStream(uri, options.getExtraForDownloader());223 if (is == null) {224 L.e(ERROR_NO_IMAGE_STREAM, memoryCacheKey);225 return false;226 } else{227 try{228 //保存到磁盘缓存

229 return configuration.diskCache.save(uri, is, this);230 } finally{231 IoUtils.closeSilently(is);232 }233 }234 }

android uil,Android进阶-UIL分析相关推荐

  1. Android基础巩固进阶

    如何创建完美的单例模式? 设计模式在软件开发者中十分受欢迎.设计模式是对于常见软件问题的良好解决方案.单例模式是 Java 中创建型设计模式的一种. 单例类的目的是控制对象创建,约束对象的数量有且只有 ...

  2. 2020最新Android开发中高级进阶书籍推荐

    很多Android开发小伙伴进阶学习都是卖一堆技术书籍.这里整理了目前最主流的中级,高级进阶书籍.感兴趣可以收藏一下,作为一个参考~ 一,中级进阶推荐看一下以下这几本书: 中级进阶书籍相信大家很熟悉, ...

  3. Android移动开发——全方面分析 Hilt 和 Koin 性能

    作者:HiDhl 前言 Koin.Dagger.Hilt 目前都是非常流行的库,面对这么多层出不穷的新技术,我们该做如何选择,是一直困扰我们的一个问题,之前我分析过 Koin 和  Dagger 的性 ...

  4. Android开发高级进阶内涵段子APP项目实战视频教程

    Android开发高级进阶内涵段子APP项目实战课程视频教程下载.本课程带你从框架入手,开启我们的Android进阶之旅,开始写一步一步完善整个项目. 项目目录: 01.Android进阶之旅与你同行 ...

  5. Android系统的JNI原理分析(二)- 数据类型转换和方法签名

    声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...

  6. Android八大模块进阶学习笔记(性能优化、百大框架、高级UI、Flutter、Kotlin...)

    今年来,Android开发行业的就业形势愈加严峻,无论刚刚入门Android学习没有头绪的.还是开发多年想要突破薪资范畴的,都需要跳出编码和业务的局限,学会选型.扩展, 提升编程思维,建立良好的职业规 ...

  7. Android应用开发进阶,一线互联网企业高级Android工程师面试题大全

    2.7 Volley 2.7.1 Volley的工作流程 2.7.2 Volley的使用 2.7.3 Volley的封装 2.7.4 Volley源码分析 2.8 RxJava 2.8.1 RxJav ...

  8. Android滤镜效果实现及原理分析

    Android在处理图片时,最常使用到的数据结构是位图(Bitmap),它包含了一张图片所有的数据.整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素.而 ...

  9. Android关于AndroidManifest.xml详细分析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  10. Android开发如何进阶?

    本着每周至少有干货产出的原则,今天必须写篇干货来回馈大家,我这的干货可是不收费的哦,争取以后的目标是让你们看完我的文章不赞赏都觉得亏得慌! 之前不少人都问我同一个问题,就是我学习Android有一两年 ...

最新文章

  1. sudo提升执行权限
  2. apache 与 php-fpm 几种处理方式
  3. led显示屏服务器怎么设置,led显示屏怎么改字幕 led显示屏改字幕方法
  4. topcoder srm 661 div1
  5. 【Dubbo篇】--Dubbo框架的使用
  6. 统计学名词解释 —— 3. 「简单随机样本」、「联合分布」与「联合密度」
  7. 数据库 sqlserver实现插入随机姓名性别民族
  8. 条码软件如何制作SCC-14条形码
  9. 计算机应届博士生的一点求职经验——概述篇
  10. Unity 图片字体制作
  11. ES6 对象的解构赋值
  12. selenium+java发送cookie,绕过验证码登录
  13. tomcat7的下载和安装配置
  14. 安卓跳转应用市场评论
  15. 站点主机安全档案(转)
  16. Axure RP 9 基础教程
  17. torch从零开始搭建deeplabv3+训练自己的数据集!
  18. 笔记本损耗60 计算机提示,笔记本买了一年 电池损耗已经60%了 怎么处理啊
  19. tiger语法分析-修改
  20. 将PDF转换成html的操作步骤

热门文章

  1. 软考初级程序员上午单选题(15)
  2. 每天学习十分钟7之做最好的自己
  3. 第五章 键盘与显示器接口技术
  4. 精细化研发提高冲压模具设计与制造的生产力
  5. Transition(过渡动画效果)
  6. 网易云音乐搜索引擎 python+whoosh---(1)背景和环境介绍
  7. android仿音乐播放器,Android仿音乐播放器功能
  8. 分享一个下载jar包的网站
  9. 大楼通信综合布线系统_综合布线系统分类有哪些?如何保障数据中心综合布线系统质量?...
  10. K3Wise对接(上传销售出库单 字段对应和细节说明)