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

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff