android uil,Android进阶-UIL分析
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分析相关推荐
- Android基础巩固进阶
如何创建完美的单例模式? 设计模式在软件开发者中十分受欢迎.设计模式是对于常见软件问题的良好解决方案.单例模式是 Java 中创建型设计模式的一种. 单例类的目的是控制对象创建,约束对象的数量有且只有 ...
- 2020最新Android开发中高级进阶书籍推荐
很多Android开发小伙伴进阶学习都是卖一堆技术书籍.这里整理了目前最主流的中级,高级进阶书籍.感兴趣可以收藏一下,作为一个参考~ 一,中级进阶推荐看一下以下这几本书: 中级进阶书籍相信大家很熟悉, ...
- Android移动开发——全方面分析 Hilt 和 Koin 性能
作者:HiDhl 前言 Koin.Dagger.Hilt 目前都是非常流行的库,面对这么多层出不穷的新技术,我们该做如何选择,是一直困扰我们的一个问题,之前我分析过 Koin 和 Dagger 的性 ...
- Android开发高级进阶内涵段子APP项目实战视频教程
Android开发高级进阶内涵段子APP项目实战课程视频教程下载.本课程带你从框架入手,开启我们的Android进阶之旅,开始写一步一步完善整个项目. 项目目录: 01.Android进阶之旅与你同行 ...
- Android系统的JNI原理分析(二)- 数据类型转换和方法签名
声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...
- Android八大模块进阶学习笔记(性能优化、百大框架、高级UI、Flutter、Kotlin...)
今年来,Android开发行业的就业形势愈加严峻,无论刚刚入门Android学习没有头绪的.还是开发多年想要突破薪资范畴的,都需要跳出编码和业务的局限,学会选型.扩展, 提升编程思维,建立良好的职业规 ...
- 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 ...
- Android滤镜效果实现及原理分析
Android在处理图片时,最常使用到的数据结构是位图(Bitmap),它包含了一张图片所有的数据.整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素.而 ...
- Android关于AndroidManifest.xml详细分析
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- Android开发如何进阶?
本着每周至少有干货产出的原则,今天必须写篇干货来回馈大家,我这的干货可是不收费的哦,争取以后的目标是让你们看完我的文章不赞赏都觉得亏得慌! 之前不少人都问我同一个问题,就是我学习Android有一两年 ...
最新文章
- sudo提升执行权限
- apache 与 php-fpm 几种处理方式
- led显示屏服务器怎么设置,led显示屏怎么改字幕 led显示屏改字幕方法
- topcoder srm 661 div1
- 【Dubbo篇】--Dubbo框架的使用
- 统计学名词解释 —— 3. 「简单随机样本」、「联合分布」与「联合密度」
- 数据库 sqlserver实现插入随机姓名性别民族
- 条码软件如何制作SCC-14条形码
- 计算机应届博士生的一点求职经验——概述篇
- Unity 图片字体制作
- ES6 对象的解构赋值
- selenium+java发送cookie,绕过验证码登录
- tomcat7的下载和安装配置
- 安卓跳转应用市场评论
- 站点主机安全档案(转)
- Axure RP 9 基础教程
- torch从零开始搭建deeplabv3+训练自己的数据集!
- 笔记本损耗60 计算机提示,笔记本买了一年 电池损耗已经60%了 怎么处理啊
- tiger语法分析-修改
- 将PDF转换成html的操作步骤
热门文章
- 软考初级程序员上午单选题(15)
- 每天学习十分钟7之做最好的自己
- 第五章 键盘与显示器接口技术
- 精细化研发提高冲压模具设计与制造的生产力
- Transition(过渡动画效果)
- 网易云音乐搜索引擎 python+whoosh---(1)背景和环境介绍
- android仿音乐播放器,Android仿音乐播放器功能
- 分享一个下载jar包的网站
- 大楼通信综合布线系统_综合布线系统分类有哪些?如何保障数据中心综合布线系统质量?...
- K3Wise对接(上传销售出库单 字段对应和细节说明)