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

相关文章

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为