Android-Universal-Image-Loader--一个界面显示本地sd以及网络图片

2024-02-13 23:58

本文主要是介绍Android-Universal-Image-Loader--一个界面显示本地sd以及网络图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该包所包含的图片如下

其中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

让用户设计读取超时时间

 该类提供了两个构造器:

[java]  view plain copy
  1. /** 
  2.      * 使用该构造器设置的对象,来设置默认最大连接时间 
  3.      * @param context 
  4.      */  
  5.     public BaseImageDownloader(Context context) {  
  6.         this.context = context.getApplicationContext();  
  7.         this.connectTimeout = DEFAULT_HTTP_CONNECT_TIMEOUT;  
  8.         this.readTimeout = DEFAULT_HTTP_READ_TIMEOUT;  
  9.     }  
  10.   
  11.     /** 
  12.      * 用户自己设定超时时间 
  13.      * @param context 
  14.      * @param connectTimeout 
  15.      * @param readTimeout 
  16.      */  
  17.     public BaseImageDownloader(Context context, int connectTimeout, int readTimeout) {  
  18.         this.context = context.getApplicationContext();  
  19.         this.connectTimeout = connectTimeout;  
  20.         this.readTimeout = readTimeout;  
  21.     }  

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

[java]  view plain copy
  1. public InputStream getStream(String imageUri, Object extra) throws IOException {  
  2.         switch (Scheme.ofUri(imageUri)) {  
  3.             case HTTP:  
  4.             case HTTPS:  
  5.                 return getStreamFromNetwork(imageUri, extra);//获取网络输入流  
  6.             case FILE:  
  7.                 return getStreamFromFile(imageUri, extra);//获取文件输入流  
  8.             case CONTENT:  
  9.                 return getStreamFromContent(imageUri, extra);//获取应用上下文的图片文件输入流  
  10.             case ASSETS:  
  11.                 return getStreamFromAssets(imageUri, extra);//获取assets的图片文件输入流  
  12.             case DRAWABLE:  
  13.                 return getStreamFromDrawable(imageUri, extra);//获取drawable里面的图片文件的输入流  
  14.             case UNKNOWN:  
  15.             default:  
  16.                 return getStreamFromOtherSource(imageUri, extra);//获取其他源的图片的输入流  
  17.         }  
  18.     }  

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

[java]  view plain copy
  1. protected HttpURLConnection createConnection(String url, Object extra) throws IOException {  
  2.         String encodedUrl = Uri.encode(url, ALLOWED_URI_CHARS);  
  3.         //通过url链接获取一个HttpUrlConnecttion  
  4.         HttpURLConnection conn = (HttpURLConnection) new URL(encodedUrl).openConnection();  
  5.         conn.setConnectTimeout(connectTimeout);  
  6.         conn.setReadTimeout(readTimeout);  
  7.         return conn;  
  8.     }  

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

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

[java]  view plain copy
  1. protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {  
  2.         HttpURLConnection conn = createConnection(imageUri, extra);//根据imagUri来获取一个HttpUrlConnection对象  
  3.   
  4.         int redirectCount = 0;  
  5.         //如果请求不成功,就再次请求直到请求成功并或者重定向的次数超过了最大请求次数  
  6.         while (conn.getResponseCode() / 100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {  
  7.             conn = createConnection(conn.getHeaderField("Location"), extra);  
  8.             redirectCount++;  
  9.         }  
  10.   
  11.         InputStream imageStream;  
  12.         try {  
  13.             //获取网络输入流,有了这个对象才能从网络中读取数据  
  14.             imageStream = conn.getInputStream();  
  15.         } catch (IOException e) {  
  16.             // Read all data to allow reuse connection (http://bit.ly/1ad35PY)  
  17.             IoUtils.readAndCloseStream(conn.getErrorStream());  
  18.             throw e;  
  19.         }  
  20.         //对网络输入流进行进一步封装,这里面应用了装饰模式  
  21.         return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());  
  22.     }  
  23.   
  24. protected InputStream getStreamFromFile(String imageUri, Object extra) throws IOException {  
  25.         String filePath = Scheme.FILE.crop(imageUri);//根据url获取路径  
  26.         return new ContentLengthInputStream(new BufferedInputStream(new FileInputStream(filePath), BUFFER_SIZE),  
  27.                 (intnew File(filePath).length());  
  28.     }  
  29.   
  30. protected InputStream getStreamFromContent(String imageUri, Object extra) throws FileNotFoundException {  
  31.         /* 
  32.          * ContentProviders存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法,则负责获取ContentProvider提供的数据; 
  33.          */  
  34.         ContentResolver res = context.getContentResolver();  
  35.         Uri uri = Uri.parse(imageUri);  
  36.         if (imageUri.startsWith(CONTENT_CONTACTS_URI_PREFIX)) {  
  37.             return ContactsContract.Contacts.openContactPhotoInputStream(res, uri);  
  38.         } else {  
  39.             return res.openInputStream(uri);  
  40.         }  
  41.     }  
  42.   
  43. protected InputStream getStreamFromAssets(String imageUri, Object extra) throws IOException {  
  44.         String filePath = Scheme.ASSETS.crop(imageUri);//获取文件的路径  
  45.         return context.getAssets().open(filePath);//获取文件的输入流  
  46.     }  
  47.   
  48.   
  49. protected InputStream getStreamFromDrawable(String imageUri, Object extra) {  
  50.         String drawableIdString = Scheme.DRAWABLE.crop(imageUri);  
  51.         int drawableId = Integer.parseInt(drawableIdString);  
  52.         return context.getResources().openRawResource(drawableId);  
  53.     }  
  54.   
  55. protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {  
  56.         throw new UnsupportedOperationException(String.format(ERROR_UNSUPPORTED_SCHEME, imageUri));  
  57.     }  

这篇关于Android-Universal-Image-Loader--一个界面显示本地sd以及网络图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706967

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,