开源项目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,现在

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.

目录
相关文章
|
30天前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
98 1
|
1月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
83 2
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
121 0
安卓项目:app注册/登录界面设计
|
2月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
4天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
23 5
|
14天前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
30 2
|
2月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
174 0
|
2月前
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)