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

相关文章

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

springboot 加载本地jar到maven的实现方法

《springboot加载本地jar到maven的实现方法》如何在SpringBoot项目中加载本地jar到Maven本地仓库,使用Maven的install-file目标来实现,本文结合实例代码给... 在Spring Boothttp://www.chinasem.cn项目中,如果你想要加载一个本地的ja

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO