文档章节

图片异步加载框架 Android-Universal-Image-Loader

董家二少
 董家二少
发布于 2014/03/28 08:49
字数 2372
阅读 233
收藏 0

1、说明文档以及相关细节

All manipulations are held by the ImageLoader class. It is a singletone, so to get a single instance of the class, you should call the getInstance() method. Before using ImageLoader to its intended purpose (to display images), you should initialize its configuration - ImageLoaderConfiguration using the init (...) method. Well, then you can use all variations of the displayImage(...) method with a clear conscience.

 

所有的操作都由ImageLoader控制。该类使用单例设计模式,所以如果要获取该类的实例,需要调用getInstance()方法。在使用ImageLoader显示图片之前,你首先要初始化它的配置,调用ImageLoaderConfiguration的init()方法,然后你就可以实现各种的显示了。

In general, the easiest option of using ImageLoader (with the default configuration) is shown below:

通常情况下,ImageLoader最简单的使用方法如下(使用默认的配置选项):

ImageView imageView = ... // view, where the image will be displayed

String imageUrl = ... // image URL (e.g. "http://site.com/image.png", "file:///mnt/sdcard/img/image.jpg")

ImageLoader imageLoader = ImageLoader.getInstance();

imageLoader.init(ImageLoaderConfiguration.createDefault(context));

imageLoader.displayImage(imageUrl, imageView);

 

 Now, let’s consider the full functionality.

现在让我们讨论下他的全部功能:

 As you already know, you first need to initialize the ImageLoader using the configuration object. As the ImageLoader is a singleton, then it should be initialized only once for application launching. I would recommend doing it in an overloaded Application.onCreate(). A reinitializing of an already initialized ImageLoader will have no effect.

So, we create a configuration, it is an object of the ImageLoaderConfiguration class. We create it using theBuilder:

 就像你已经知道的,首先,你需要使用ImageLoaderConfiguration对象来初始化ImageLoader。由于ImageLoader是单例,所以在程序开始的时候只需要初始化一次就好了。建议你在Activity的onCreate()方法中初始化。如果一个ImageLoader已经初始化过,再次初始化不会有任何效果。下面我们通过ImageLoaderConfiguration.Builder创建一个设置

File cacheDir = StorageUtils.getCacheDirectory(context,

"UniversalImageLoader/Cache");

 

ImageLoaderConfiguration config = new

ImageLoaderConfiguration.Builder(getApplicationContext())

.maxImageWidthForMemoryCache(800)

.maxImageHeightForMemoryCache(480)

.httpConnectTimeout(5000)

.httpReadTimeout(20000)

.threadPoolSize(5)

.threadPriority(Thread.MIN_PRIORITY + 3)

.denyCacheImageMultipleSizesInMemory()

.memoryCache(new UsingFreqLimitedCache(2000000)) // You can pass your own memory cache implementation

.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation

.defaultDisplayImageOptions(DisplayImageOptions.createSimple())

.build();


Let’s consider each option:

下面上我们来讨论一下每个选项:   

• maxImageWidthForMemoryCache() and maxImageHeightForMemoryCache() is used for decoding images into Bitmap objects. In order not to store a full-sized image in the memory, it is reduced to a size determined from the values of ImageView parameters, where the image is loaded: maxWidth and maxHeight (first stage),layout_width and layout_height (second stage). If these parameters are not defined (values fill_parentand wrap_content are considered as uncertain), then dimensions specified by settings maxImageWidthForMemoryCache() and maxImageHeightForMemoryCache() are taken. The size of the original image is reduced by 2 times (recommended for fast decoding), till the width or height becomes less than the specified values;

•用于将图片解码为Bitmap对象。为了避免将原图存到内存中,系统会根据ImageView的参数来缩小图片的尺寸,这些参数包括maxWidth 、maxHeight 、layout_width 、layout_height .如果这些参数没有指定,尺寸将会根据maxImageWidthForMemoryCachemaxImageHeightForMemoryCache指定。原始图片的尺寸将会被缩减两次,知道宽和高比指定的值小。

o Default values - size of the device’s screen.

o 默认值 - 设备屏幕的尺寸

• httpConnectTimeout() sets the maximum waiting time (in milliseconds) for establishing an HTTP connection;

• 设置建立HTTP连接的最大超时时间

o Default value - 5 seconds

o 默认值 - 5秒

 httpReadTimeout() sets the maximum time (in milliseconds) for loading an image from the Web;

• 设置从网络上加载图片的最大超时时间

o Default value - 30 seconds

o 默认值 - 30秒

• threadPoolSize() sets size of the thread pool. Each task on image loading and displaying is performed in a separate thread, and those threads, in which the image uploading from the Web occurs, get to the pool. Thus, the pool size determines the number of threads running simultaneously. Setting of a large pool size can significantly reduce the speed of the UI, for example, list scrolling could slow down.

• 设置线程池的大小。每一个加载和显示图片的任务都运行在独立的线程中,因此,线程池的大小决定了可以同时运行的线程数,如果设置的过大,将会降低UI线程的反应速度,比如List滑动时可能会卡顿。

o Default value - 5

o 默认值 - 5

• threadPriority() sets priority of all threads in the system (from 1 to 10), in which tasks are performed;

•设置当前线程的优先级(1 -- 10)

o Default value - 4

o 默认值 - 4

• calling denyCacheImageMultipleSizesInMemory() imposes a ban on storing different sizes of the same image in the memory. As full-size images are stored in the disk cache, and when loading into memory, they are reduced to the size of ImageView, in which they should be displayed, then there are cases when the same image has to be displayed first in a small view, and then in a big one. At the same time, two Bitmaps of different sizes representing the same image will be stored in the memory. This is the default behavior.  

• 调用该方法会禁止在内存中缓存同一张图片的多个尺寸。当把本地图片加载到内存中时,首先会把图片缩减至要显示的ImageView的大小,因此可能会出现一种状况,就是会首先显示一张图的小图,然后再显示这张图的大图。这种情况下,同一张图片的两种尺寸的Bitmap会被存储在内存中,这是默认的操作

The denyCacheImageMultipleSizesInMemory() instruction ensures deletion of the previous size of the loaded image from cache in the memory.

该方法会确保删除已加载图片缓存在内存中的其他尺寸的缓存。

• Using memoryCache(), you can specify the implementation of cache in the memory. You can use ready-made solutions (they all are realizations of limited size-cache; where by exceeding cache size, an object is removed from it by a certain algorithm):

•  调用该方法,你可以指定在内存中缓存的实现。你可以使用如下这些已有的解决方案

FIFOLimitedCache (the object is removed on the basis of First-In-First-Out)

o 按照FIFO规则清理内存

LargestLimitedCache (the largest-sized object is removed)

o 移除最大的缓存

UsingAgeLimitedCache (the object with the oldest date of access is removed)

o 按照访问时间,移除最久之前的缓存

UsingFreqLimitedCache (the most rarely used object is removed)

o 按照使用频率,移除最少使用的缓存

Alternatively, you can implement your own version of the cache by implementing the interface MemoryCacheAware<String, Bitmap>;

当然,你也通过实现接口 MemoryCacheAware<String, Bitmap>来实现一个自定义的清除缓存的方法,

o Default value - UsingFreqLimitedCache with memory limit to 2 MB

o 默认值 - UsingFreqLimitedCache  ,缓存大小2MB

memoryCacheSize() sets the maximum cache size in the memory. In this case, the default cache is used -UsingFreqLimitedCache.

设置内存中缓存的大小。这种情况下,默认的缓存方法是用UsingFreqLimitedCache

o Default value - 2 MB

o 默认值 - 2MB

• Using discCache(), you can define cash implementation in the file system. You can use ready-made solutions (where the files matching certain URLs are named as hash codes of these URLs):

• discCache()设置本地缓存。你可以使用以下已实现的方法

UnlimitedDiscCache (usual cache, no restrictions)

o 不限制缓存大小

FileCountLimitedDiscCache (cache with limited size)

o 限制缓存的文件数量(楼主可能把注释写反了)

TotalSizeLimitedDiscCache (cache with limited files number)

o 限制缓存文件的总大小

Alternatively, you can define your own cache implementation by DiscCacheAware interface.

当然你可以实现接口DiscCacheAware 来自定义缓存的实现方法

o Default value - UnlimitedDiscCache

o 默认值 - UnlimitedDiscCache

• discCacheSize(int) specifies the maximum cache size in the file system. In this case, the TotalSizeLimitedDiscCache is used.

• 指定在本地的最大缓存大小。在这种情况下,TotalSizeLimitedDiscCache 会被使用

• discCacheFileCount(int) specifies the maximum number of files in the disk cache. In this case, the FileCountLimitedDiscCache is used.

• 指定在本地缓存的文件数量。在这种情况下,FileCountLimitedDiscCache 会被使用

• Using defaultDisplayImageOptions(), you can set image displaying options, which will be used for all calls of the displayimage(...) method, where custom options were not passed.

•使用defaultDisplayImageOptions你可以设置图片的显示选项,这些选项会在调用displayimage(...)的时候被使用。

 I’ll discuss these options in details below.

在下面我会讨论这些选项 

We can construct a configuration object ourselves or trust a developer (i.e. me) and use the default configuration:

我们可以自定义配置选项,也可以trust me,使用我提供的默认选项:

 

ImageLoaderConfiguration config  =

          ImageLoaderConfiguration.createDefault(context);

  

Thus, the configuration is created. Now, the ImageLoader can be initialized with it:

这样,一个设置就创建了,之后,你就可以用它来初始化ImageLoader

ImageLoader.getInstance().init(config);

That's all, the ImageLoader is ready to use. I'll tell you about this in the next article.

这时候ImageLoader就可以使用了。


2、使用范例

    

1.自定义XXXAppllication类,初始化ImageLoader

public class XXXApplication extends Application {  

    @Override  

    public void onCreate() {  

        super.onCreate();  

  

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())  

            //这下面的参数就不一一解释了

            .denyCacheImageMultipleSizesInMemory()  

            .memoryCache(new LruMemoryCache(2 * 1024 * 1024))  

            .memoryCacheSize(2 * 1024 * 1024)  

            .discCacheSize(50 * 1024 * 1024)  

            .denyCacheImageMultipleSizesInMemory()    

            .discCacheFileNameGenerator(new Md5FileNameGenerator())    

            .tasksProcessingOrder(QueueProcessingType.LIFO)    

            .discCacheFileCount(100)  

            .writeDebugLogs()  

            .build();  

        ImageLoader.getInstance().init(config);  

    }  

}  

 

2.在AndroidManifest.xml文件的application标签里加入

[java]  

android:name=".XXXApplication"  

 

3.使用imageloader

[java] 

public class ImageManager{  

  

     public static void Load(String imgUrl,ImageView imageView){  

        ImageLoader.getInstance().displayImage(imgUrl, imageView);  

     }  

  

     public static void Load(String imgUrl,ImageView imageView,DisplayImageOptions o){  

         ImageLoader.getInstance().displayImage(imgUrl, imageView,o);  

     }  

}  


当然对于图片的显示上是可以不同的情况采用不同的配置来显示,如果用默认构造方法的话,那么显示的效果就是你在

XXXAppllication类中定义好的效果了,如果,有一部分是需要特殊处理的,比如说要有圆角,那么就需要自己单独的再写一下配置,在当前的类的构造方法或者onCreate();中初始化,如下

private DisplayImageOptions options;

public MyPhotoEditAdapter(Context context,List<String> imgUrlList){

this.context=context;

this.imgUrlList=imgUrlList;

options = new DisplayImageOptions.Builder()

.showStubImage(R.drawable.icon_default2x)

.showImageForEmptyUri(R.drawable.icon_default2x)

.cacheOnDisc() // 缓存用

.displayer(new RoundedBitmapDisplayer(8)) // 图片圆角显示,值为整数

.build();

}

在使用的时候一行代码就可以直接显示了

ImageLoader.getInstance().displayImage(图片的网络地址Url, 显示图片的控件ImageView,这个就是你自己写的配置了options);


使用默认配置的方式显示图片就更简单了

ImageLoader.getInstance().displayImage(图片的网络地址uri,显示图片的控件 imageView);


最后千万要记得

AndroidManifest.xml文件的application标签里加入

android:name=".XXXApplication"  

否则你的程序就会报错,提示ImageLoader没有实例化


OK,简单的解析就到这里,欢迎大家一起讨论




© 著作权归作者所有

共有 人打赏支持
董家二少
粉丝 3
博文 34
码字总数 85000
作品 0
海淀
程序员
私信 提问
UltimateAndroid快速开发框架教程

UltimateAndroid是一套集成了许多现有优秀的Android开源类库并将之组合成一个整体的Android快速开发框架。 框架目前主要包含的功能有View Injection,ORM,异步网络请求和图片加载,自动化脚本...

MarshalChen
2014/09/09
2.9K
6
安卓图片加载框架--Universal-Image-Loader

  今天来介绍图片加载的框架Android-Universal-Image-Loader   GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader   也可以自行百度下载。   首先...

痞子姜
2015/09/18
0
0
图片异步加载框架

https://github.com/nostra13/Android-Universal-Image-Loader

baiyu7297
2015/09/27
1
0
最美应用-从Android研发工程师的角度之[最美时光]

最美应用-从Android研发工程师的角度之最美时光 @author ASCE1885的 Github 简书 微博 CSDN 最近发现最美应用这样一个网站,它会定期推介一些很有意思的app,作为开发者,每次看到很棒的app...

2tman
2015/08/19
0
0
Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍

转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 大家好!差不多两个来月没有写文章了,前段时间也是在...

程序袁_绪龙
2015/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java网络编程

基本概念 网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。 一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户内存的过程是否需要...

春哥大魔王的博客
23分钟前
0
0
Spring "reg:zookeeper" 的前缀 "reg" 未绑定等类似问题解决方案。

今天同事遇到一个Spring启动加载配置文件时,不识别reg:zookeeper标签的问题。 我查看配置,发现是Spring配置文件的头部没有引入reg标签的命名空间,具体如下图: 所以,以后遇到类似的标签未...

花漾年华
52分钟前
1
0
阿里云领衔云市场

近期,2018年Q4及全年的全球云基础设施服务市场数据新鲜出炉,发布方是美国市场研究机构Synergy Research Group。这个机构是专做电信网络市场情报的公司,成立于1999年,每年都会公布各大公有...

linuxCool
今天
2
0
C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
今天
3
0
JAVA对map进行分组

public static Map<String, List<Map<String, Object>>> transition(List<Map<String, Object>> list){ Map<String, List<Map<String, Object>>> map = new HashMap<>(); //......

火龙战士
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部