专栏首页向治洪开源项目Universal Image Loader for Android

开源项目Universal Image Loader for Android

In the previous article, we’ve initialized the ImageLoader with configuration; and now, it is ready for immediate use according to its intended purpose.

 在之前的章节,我们已经通过配置初始化了ImageLoader,现在,我们来介绍一下怎么使用ImageLoader

For this, it has four overloaded methods:

有下面四个重载的方法

 void displayImage(String url, ImageView view)
 void displayImage(String url, ImageView view, DisplayImageOptions options)
 void displayImage(String url, ImageView view, ImageLoadingListener listener)
 void displayImage(String url, ImageView view, DisplayImageOptions options, ImageLoadingListener listener)

The first option.

 void displayImage(String url, ImageView view)

Everything is simple. We say, from which URL an image should be downloaded and in which ImageView it should be displayed. The view options (DisplayImageOptions) will be taken from configuration (defaultDisplayImageOptions (...)) in this case.

最简单的方式,我们只需要定义要显示的图片的URL和要显示图片的ImageView。这种情况下,图片的显示选项会使用默认的配置

The second option.

 void displayImage(String url, ImageView view, DisplayImageOptions options)

We already can define certain options for a specific task. First, I’ll give an example of creating my own options: 

我们可以自定义一个显示选项。下面是一个例子

 DisplayImageOptions options = new DisplayImageOptions.Builder()
     .showStubImage(R.drawable.stub_image)
     .showImageForEmptyUrl(R.drawable.image_for_empty_url)
     .cacheInMemory()
     .cacheOnDisc()
     .decodingType(DecodingType.MEMORY_SAVING)
     .build();

Yes, Builder again. As mentioned in the first article, we can specify using DisplayImageOptions:

如同我们在第一篇文章中提到的,我们可以自定义图片的显示选项:

• whether to display the stub image in ImageView, while the real image is downloading, and what image should be displayed; 

加载过程中是否显示图片的stub,如果显示的话显示那个

• whether to display the stub image in ImageView if empty image URL was passed, and what image should be displayed;

URL错误的时候,是否显示一个stub,如果显示的话显示那一个

• whether to cache the loaded image in memory;

是否在内存中缓存已加载图片

• whether to cache the downloaded image on file system.

是否缓存已下载图片到本地

• to decode the image as quickly as possible (DecodingType.FAST) or as economical for RAM as possible (DecodingType.MEMORY_SAVING).

快速解析图片或者经济模式

So, we can pass these options every time by calling displayImage() method or we can specify default options in configuration for initialization; and they will be used in all cases when options weren’t explicitly passed by method calling.

 所以,我们可以在每次调用 displayImage() 方法的时候传入这些参数,或者调用默认的选项来初始化

In addition, you can "listen" the process of image downloading and displaying using the interface ImageLoadingListener:The third option.

除此之外,我们还可以通过接口ImageLoadingListener监听图片下载和现实的过程

 public interface ImageLoadingListener {
     void onLoadingStarted();
     void onLoadingFailed();
     void onLoadingComplete();
 }

And the fourth option is the most powerful one. You can both define options and "listen" to the process.

 void displayImage(String url, ImageView view, DisplayImageOptions options, ImageLoadingListener listener)

这是最强大的方法,你既可以定制选项有可以监听过程。

Tips and tricks

小提示:

1. To perform its functions, the ImageLoader should receive correct parameters. And the point is ImageView rather than image URL. If you create an ImageView object in code (not using LayoutInflater), then pass the current Activity to constructor, and not the application context:

要想实现ImageLoader的功能,你必须传递进去正确的参数。关键点是ImageView要比URL重要。如果你在代码中创建了一个ImageView对象,那么在构造函数中你就要把当前的Activity传递进去作为Context,而不是Application作为Context

 ImageView imageView = new ImageView(getApplicationContext()); //错误
 ImageView imageView = new ImageView(MyActivity.this); //正确
 ImageView imageView = new ImageView(getActivity()); // 正确 (用于 Fragments)

2. You should configure the maxImageWidthForMemoryCache(...) and maxImageHeightForMemoryCache(...) parameters in configuration only if you want to load in the ImageView images with size larger than size of the device's screen (for example, for subsequent zooming). In all other cases, you don’t need this: these parameters consider the screen size by default for saving memory when working with Bitmaps.

 只有在你需要让Image的尺寸比当前设备的尺寸大的时候,你才需要配置maxImageWidthForMemoryCache(...)和maxImageHeightForMemoryCache(...)这两个参数,比如放大图片的时候。其他情况下,不需要做这些配置,因为默认的配置会根据屏幕尺寸以最节约内存的方式处理Bitmap。

3. Set thread pool size in the configuration wisely: a large pool size (> 10) will allow multiple threads to work simultaneously, which can significantly affect the UI work speed. But it can be fixed by setting a lower priority for threads: the lower priority is the more responsive UI is while ImageLoader work and the longer images are loaded. UI responsiveness is critical to the lists (smooth scrolling), so you should play around with setting of threadPoolSize(...) and threadPriority(...) parameters for selection of the optimal configuration for your application.

 在设置中配置线程池的大小是非常明智的。一个大的线程池会允许多条线程同时工作,但是也会显著的影响到UI线程的速度。但是可以通过设置一个较低的优先级来解决:当ImageLoader在使用的时候,可以降低它的优先级,这样UI线程会更加流畅。在使用List的时候,UI 线程经常会不太流畅,所以在你的程序中最好设置threadPoolSize(...)和threadPriority(...)这两个参数来优化你的应用。

4. memoryCacheSize(...) and memoryCache(...) settings overlap each other. Use only one of them for one configuration object.

 这两个参数会互相覆盖,所以在Configuration中使用一个就好了

5. discCacheSize(...), discCacheFileCount(...) and discCache(...) settings overlap each other, using only one of them for one configuration object.

 这三个参数会互相覆盖,只使用一个

6. If by using the ImageLoader in an application you always (or almost always) pass into the displayImage(...)method the same loading options (DisplayImageOptions), then a reasonable solution would be setting these options in the ImageLoader configuration as default options (defaultDisplayImageOptions(...) method). Then, you should not indicate these options by calling displayImage(...). If options aren’t explicitly given to the method, then default option will be used for this task.

 如果你的程序中使用displayImage()方法时传入的参数经常是一样的,那么一个合理的解决方法是,把这些选项配置在ImageLoader的设置中作为默认的选项(通过调用defaultDisplayImageOptions(...)方法)。之后调用displayImage(...)方法的时候就不必再指定这些选项了,如果这些选项没有明确的指定给defaultDisplayImageOptions(...)方法,那调用的时候将会调用UIL的默认设置。

7. There is no significant difference between FAST and MEMORY_SAVING decoding types, but it is recommended to use FAST for all kinds of lists (where you want to display many images of small size), and MEMORY_SAVING for galleries (where you want to display images of large size).

在图片解析的时候使用 FAST 或者 MEMORY_SAVING模式,并不会有明显的区别。但是如果要在list中显示的时候,建议使用FAST模式,Gallery中显示的时候建议使用MEMORY_SAVING模式。

So, I've completed my story about the Universal Image Loader. The project sources are available on GitHub.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高仿今日头条(2)

    接上一篇博客:http://blog.csdn.net/xiangzhihong8/article/details/51262939 这部分主要是实现频道管理页...

    xiangzhihong
  • 仿qq最新侧滑菜单

    为了后续对这个项目进行优化,比如透明度动画、背景图的位移动画,以及性能上的优化。 我把这个项目上传到github上面,请大家随时关注。 github地址 htt...

    xiangzhihong
  • Android Remote Views

    听名字就可以看出,remote views是一种远程view,感觉有点像远程service,其实remote views是view的一个结构,他可以在其他的进程...

    xiangzhihong
  • ImageView的属性和方法大全

    通过前面几期的学习,TextView控件及其子控件基本学习完成,可以在Android屏幕上显示一些文字或者按钮,那么从本期开始来学习如何进行图片展示,这...

    分享达人秀
  • 算法训练 K好数

    如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有...

    刘开心_1266679
  • Golang Leetcode 454. 4Sum II.go

    版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89143799

    anakinsun
  • P1525 关押罪犯 并查集

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户2965768
  • hdu-----(2807)The Shortest Path(矩阵+Floyd)

    The Shortest Path Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/...

    Gxjun
  • 15:整理药名

    15:整理药名 总时间限制: 1000ms 内存限制: 65536kB描述 医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书...

    attack
  • C++11新特性——range for

    很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中。range for语句,可以方便的遍历给定序列中的每个元素并对其...

    Dabelv

扫码关注云+社区

领取腾讯云代金券