该包所包含的图片如下

其中ImageDownloader为接口,BaseImageDownloader为ImageDownloaer的实现类。

ImageDownloader(接口)

该接口对外提供了一个接口方法:

InputStream getStream(String imageUri,Object extra) throws IOException;

很明显该方法的作用很明显是获取imageUri指定的图片文件的输入流。

由于imageUri所指定的文件源可以来自不同种类的服务器或者地址,所以该接口又定义了一个枚举类Scheme来指定imageUri的来源属于什么种类,其所列举的类型有如下几种:

HTTP("http"), HTTPS("https")

图片来源于http服务器

FILE("file")

imageUri为file协议的字符串

CONTENT("content")

图片文件来源于app的contentprovider

ASSETS("assets")

图片来源于app中的assets文件夹

DRAWABLE("drawable")

图片来源于app的drawable文件夹

UNKNOWN("")

图片来源于其它的途径,在这种情况下,会抛出runtimeexception异常

同时该枚举类还提供了如下几个方法:

ofUri(String uri):此方法根据图片的uri来判断该图片属于以上七个枚举类型的哪一个种。

wrap(String path):此方法用来为path加上uri的前缀,比如http://+path

corp(String uri):与wrap方法相反,去掉uri的前缀

注意:该枚举类的最重要的作用就是根据不同枚举类型来返回图片的不同的图片文件输入流。这个在该接口的实现类BaseImageDownloader会体现出来。

BaseImageDownloader(implements ImageDownLoader)

该类的主要作用是根据imageUri来获取图片文件的输入流,提供了如下几个重要属性:

字段名

属性

字段说明

DEFAULT_HTTP_CONNECT_TIMEOUT

final int

网络链接的最大超时时间

DEFAULT_HTTP_READ_TIMEOUT

final int

从主机中读书数据的超时时间

BUFFER_SIZE

final int

缓存的大小,为32k

MAX_REDIRECT_COUNT

final int

链接网络超时的时候重新请求链接的次数

CONTENT_CONTACTS_URI_PREFIX

final int

当图片来自contentprovider的时候用到它

ERROR_UNSUPPORTED_SCHEME

final int

错误信息,当imageUri的scheme属于UNKNOWN的时候,提示错误信息

context

Context

app应用的上下文

connectTimeout

int

让用户设置链接超时时间

readTimeout

int

让用户设计读取超时时间

该类提供了两个构造器:

/*** 使用该构造器设置的对象,来设置默认最大连接时间* @param context*/public BaseImageDownloader(Context context) {this.context = context.getApplicationContext();this.connectTimeout = DEFAULT_HTTP_CONNECT_TIMEOUT;this.readTimeout = DEFAULT_HTTP_READ_TIMEOUT;}/*** 用户自己设定超时时间* @param context* @param connectTimeout* @param readTimeout*/public BaseImageDownloader(Context context, int connectTimeout, int readTimeout) {this.context = context.getApplicationContext();this.connectTimeout = connectTimeout;this.readTimeout = readTimeout;}

下面看看该类是如何实现接口的getStream方法的,具体代码如下

public InputStream getStream(String imageUri, Object extra) throws IOException {switch (Scheme.ofUri(imageUri)) {case HTTP:case HTTPS:return getStreamFromNetwork(imageUri, extra);//获取网络输入流case FILE:return getStreamFromFile(imageUri, extra);//获取文件输入流case CONTENT:return getStreamFromContent(imageUri, extra);//获取应用上下文的图片文件输入流case ASSETS:return getStreamFromAssets(imageUri, extra);//获取assets的图片文件输入流case DRAWABLE:return getStreamFromDrawable(imageUri, extra);//获取drawable里面的图片文件的输入流case UNKNOWN:default:return getStreamFromOtherSource(imageUri, extra);//获取其他源的图片的输入流}}

该类还提供了一个createConnection方法来根据imageUrl来获取一个httpUrlConnection的链接对象

protected HttpURLConnection createConnection(String url, Object extra) throws IOException {String encodedUrl = Uri.encode(url, ALLOWED_URI_CHARS);//通过url链接获取一个HttpUrlConnecttionHttpURLConnection conn = (HttpURLConnection) new URL(encodedUrl).openConnection();conn.setConnectTimeout(connectTimeout);conn.setReadTimeout(readTimeout);return conn;}

当imageuri的scheme为http,https和file的时候返回的输入流对象是经过装饰(装饰模式的应用)的输入流对象ContentLengthInputStream

下面贴出来getStream方法中所涉及的方法如下:

protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {HttpURLConnection conn = createConnection(imageUri, extra);//根据imagUri来获取一个HttpUrlConnection对象int redirectCount = 0;//如果请求不成功,就再次请求直到请求成功并或者重定向的次数超过了最大请求次数while (conn.getResponseCode() / 100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {conn = createConnection(conn.getHeaderField("Location"), extra);redirectCount++;}InputStream imageStream;try {//获取网络输入流,有了这个对象才能从网络中读取数据imageStream = conn.getInputStream();} catch (IOException e) {// Read all data to allow reuse connection (http://bit.ly/1ad35PY)IoUtils.readAndCloseStream(conn.getErrorStream());throw e;}//对网络输入流进行进一步封装,这里面应用了装饰模式return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());}protected InputStream getStreamFromFile(String imageUri, Object extra) throws IOException {String filePath = Scheme.FILE.crop(imageUri);//根据url获取路径return new ContentLengthInputStream(new BufferedInputStream(new FileInputStream(filePath), BUFFER_SIZE),(int) new File(filePath).length());}protected InputStream getStreamFromContent(String imageUri, Object extra) throws FileNotFoundException {/** ContentProviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法,则负责获取ContentProvider提供的数据;*/ContentResolver res = context.getContentResolver();Uri uri = Uri.parse(imageUri);if (imageUri.startsWith(CONTENT_CONTACTS_URI_PREFIX)) {return ContactsContract.Contacts.openContactPhotoInputStream(res, uri);} else {return res.openInputStream(uri);}}protected InputStream getStreamFromAssets(String imageUri, Object extra) throws IOException {String filePath = Scheme.ASSETS.crop(imageUri);//获取文件的路径return context.getAssets().open(filePath);//获取文件的输入流}protected InputStream getStreamFromDrawable(String imageUri, Object extra) {String drawableIdString = Scheme.DRAWABLE.crop(imageUri);int drawableId = Integer.parseInt(drawableIdString);return context.getResources().openRawResource(drawableId);}protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {throw new UnsupportedOperationException(String.format(ERROR_UNSUPPORTED_SCHEME, imageUri));}

Android-Universal-Image-Loader学习笔记(4)--download相关推荐

  1. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  2. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  3. Android日常开发 - FlexboxLayout学习笔记

    Android日常开发 - FlexboxLayout学习笔记 Android日常开发使用FlexboxLayout实现流式布局的效果,FlexboxLayout与h5中的flex使用十分相似,都是将 ...

  4. Android Studio下载搭建学习笔记01

    Android Studio下载搭建学习笔记01 下载Android Studio 安装Android Studio 进入安装向导 选择安装组件 选择安装位置 选择文件菜单 等待安装 启动并配置And ...

  5. 我的Android进阶之旅------gt;Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  6. [Android]Android P(9) WIFI学习笔记 - HAL (1)

    目录 前文回顾 前言 入口 WifiNative 初始化 打开WIFI IWifiChip IWifiCond ISupplicant 前文回顾 WIFI学习笔记 - Framework (1) WI ...

  7. Android高级终端开发学习笔记(《疯狂Android讲义》第11章-第17章)

    Android高级终端开发笔记 2021/6/19 下午 13:34开始 多媒体应用开发 Android支持的音频格式有:MP3 WAV 3GP等.支持的视频格式有MP4 3GP等. 多媒体数据既可以 ...

  8. Android的LMK机制学习笔记

    初识Android的LMK机制 一.文章背景 1.1 LMK中kill进程的关键log(原生系统):![LMK中kill进程的关键log](https://img-blog.csdnimg.cn/78 ...

  9. Android高级终端开发学习笔记(《疯狂Android讲义》第2章-第10章)

    Android疯狂讲义前10章知识点总结 /-------------------------10-31号晚上学习笔记----------------------------/ 在设置了最小支持版本为 ...

  10. Android开发艺术探索学习笔记 第二章IPC

    最近将之前工作做本地的学习笔记上传一下 这里是Android艺术开发探索的前三章内容 文章目录 1. android的多进程模式 2. IPC基础概念介绍 2.1 Serializable 2.2Pa ...

最新文章

  1. “十四五”要建设的「交通强国」,会让我们都坐上自动驾驶车么?
  2. ios开发-系统架构
  3. Linux(debian)操作基础(二)之ASPM(活动状态电源管理)
  4. gradle 修改java代码_Gradle 插件
  5. Wifi 与 2G/3G
  6. 会话技术——Cookie和Session
  7. 基于asp.net面向小商户的轻量级仓储管理系统
  8. 基于Python分析实现酒店评论的中文情感
  9. python爬取起点小说_Python简单爬取起点中文网小说(仅学习)
  10. java天津与深圳,国内最可惜的城市:GDP曾是深圳的38倍,如今GDP被反超万亿!
  11. 搜索引擎工作原理解析
  12. 浅谈在windows系统下esp8266和esp32开发共存一个eclipse编译器,非安信可一体化环境,而是搭建自己的eclipes环境。
  13. 原生版本 电信卡HD语音通话记录没有显示为‘外拨的4G高清语音’仅显示为‘外拨的通话’
  14. JAVA格式代码出现两次_NullPointerException使用JMockit测试Mocked java.io.File两次
  15. 移动营业执照识别SDK
  16. Taro引入阿里图标
  17. 操作系统考研复试、工作面试常见问题及答案
  18. BRL_CAD 教程
  19. android5rom下载,android5.2系统|安卓android5.2系统刷机包正式版 5.2 - 系统天堂
  20. Elasticsearch 的全量同步和增量同步

热门文章

  1. arduino串口监视器显示nan_Arduino常用的三种通信协议UART, I2C和SPI
  2. 大数据学情分析_大数据时代|如何轻松做好学情分析
  3. java super.getclass_详解java中this.getClass()和super.getClass()的实例
  4. 检测空指针 静态检测_Parasoft为G3提供专注于安全性和整体软件质量的静态分析解决方案...
  5. android 样式预处理,基于Android平台的字符识别预处理算法设计与实现
  6. log explorer for sql 不存在或访问被拒绝_原创干货 | 未授权访问漏洞批量化
  7. 三维重建_基于RGB-D相机的三维重建总览(静态动态)
  8. 超级干货 | 用万字文章总结25种正则化方法(值得收藏)
  9. 修改一行代码,将图像匹配效果提升14%
  10. 图及算法----并查集父亲查找写法比较 DisjointSet