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

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动