Universal Image Loader for Android 使用实例

<span style="white-space:pre">      </span>// 1.获取ImageLoader实例 
        ImageLoader imageLoader = ImageLoader.getInstance();  
 // 2. 使用默认配置 
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);  
 // 3. 初始化ImageLoader 
        imageLoader.init(configuration);  
 // 4. 显示图片时的配置 
        displayImageOptions = new DisplayImageOptions.Builder().cacheInMemory().cacheOnDisc()  
                .bitmapConfig(Config.RGB_565).build();  
 // 5.显示图片 
        imageLoader.displayImage(uri, imageView, displayImageOptions);  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下为参照原文进行的翻译

1.    Caching默认不可用. 启用需要对DisplayImageOptions进行如下配置:

2.  // Create default options which will be usedfor every
3.  // displayImage(...) call if no options will be passed to this method
4.  DisplayImageOptions defaultOptions= new DisplayImageOptions.Builder()
5.   ...
6.   .cacheInMemory()
7.   .cacheOnDisc()
8.   ...
9.   .build();
10. ImageLoaderConfiguration config= new ImageLoaderConfiguration.Builder(getApplicationContext())
11.  ...
12.  .defaultDisplayImageOptions(defaultOptions)
13.  ...
14.  .build();
15. ImageLoader.getInstance().init(config);//  Do it on Application start
16. // Then later, when you want to display image
17. ImageLoader.getInstance().displayImage(imageUrl,  imageView); // Default options will be used

or this way:

DisplayImageOptions options= new DisplayImageOptions.Builder()
 ...
 .cacheInMemory()
 .cacheOnDisc()
 ...
 .build();
ImageLoader.getInstance().displayImage(imageUrl,  imageView, options); // Incoming options will be used

18.  开启缓存后默认会缓存到外置SD卡如下地址(/sdcard/Android/data/[package_name]/cache).如果外置SD卡不存在,会缓存到手机.缓存到Sd卡需要在Manifest文件中进行如下配置

19. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

20.  UIL是如何为ImageView精确定义需要的Bitmap的尺寸?它会搜索如下参数

o   获取ImageView真实的 width和 height

o   获取 android:layout_width 和 android:layout_height 参数

o   获取 android:maxWidth and/or android:maxHeight 参数

o   从configuration (memoryCacheExtraOptions(int,int) option)获取 maximum width and/or height 参数

o   获取设备屏幕的 width and/or height  

所以如果你知道ImageView的大约最大尺寸,就可以设置如下参数android:layout_width|android:layout_height or android:maxWidth|android:maxHeight 这样会有助于正确计算当前View所需要的Bitmap尺寸,并节约内存

如果你使用UIL时经常出现 OutOfMemoryError 那你可以尝试如下方法:

o   减少线程池大小 (.threadPoolSize(...)). 1 - 5 isrecommended.

o   在显示选项中使用 .bitmapConfig(Bitmap.Config.RGB_565) . RGB_565模式消耗的内存比ARGB_8888模式少两倍.

o   配置中使用 .memoryCache(newWeakMemoryCache()) 或者完全禁用在内存中缓存(don't call .cacheInMemory()).

o   在显示选项中使用 .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 或者.imageScaleType(ImageScaleType.EXACTLY).

o   避免使用 RoundedBitmapDisplayer.调用的时候它使用ARGB-8888模式创建了一个新的Bitmap对象来显示

对于内存缓存模式 (ImageLoaderConfiguration.memoryCache(...))你可以使用已经实现好的方法.

o   缓存只能使用强引用

§ LruMemoryCache (Least recently used bitmap is deleted when cache size limit isexceeded缓存大小超过指定值时,删除最近最少使用的bitmap) - Used by default for API >= 9

o   缓存使用弱引用和强引用:

§ UsingFreqLimitedMemoryCache (Least frequently used bitmap is deleted when cachesize limit is exceeded删除最少使用bitmap)

§ LRULimitedMemoryCache (Least recently used bitmap is deletedwhen cache size limit is exceeded删除最近最少使用bitmap) - Used by default for API < 9

§ FIFOLimitedMemoryCache (FIFOrule is used for deletion when cache sizelimit is exceeded先进先出规则删除bitmap)

§ LargestLimitedMemoryCache (The largest bitmap is deleted when cache sizelimit is exceeded删除最大的bitmap)

§ LimitedAgeMemoryCache (Decorator. Cached object is deleted when its ageexceeds defined value缓存对象超过定义的时间后删除)

o   缓存只能使用弱引用:

§ WeakMemoryCache (Unlimited cache不限制缓存)

21.  本地缓存模式可以使用以下以实现的方法 (ImageLoaderConfiguration.discCache(...)):

o   UnlimitedDiscCache (The fastest cache, doesn't limit cache size不限制缓存大小) - Used by default

o   TotalSizeLimitedDiscCache (Cache limited by total cache size. If cache size exceedsspecified limit then file with the most oldest last usage date will be deleted设置总缓存大小,超过时删除最久之前的缓存)

o   FileCountLimitedDiscCache (Cache limited by file count. If file count incache directory exceeds specified limit then file with the most oldest lastusage date will be deleted. Use it if your cached files are of about the samesize.设置总缓存文件数量,当到达警戒值时,删除最久之前的缓存。如果文件的大小都一样的时候,可以使用该模式)

o   LimitedAgeDiscCache (Size-unlimited cache with limited files' lifetime.If age of cached file exceeds defined limit then it will be deleted from cache.不限制缓存大小,但是设置缓存时间,到期后删除)

NOTE: UnlimitedDiscCache比其他方式快30%以上.

22.  To displaybitmap (DisplayImageOptions.displayer(...)) you can usealready prepared implementations:

o   RoundedBitmapDisplayer (Displays bitmap with rounded corners)

o   FadeInBitmapDisplayer (Displays image with "fade in" animation)

23.  To avoid list(grid, ...) scrolling lags you can use PauseOnScrollListener:

24. boolean pauseOnScroll= false; // or true
25. boolean pauseOnFling= true; // or false
26. PauseOnScrollListener listener= new PauseOnScrollListener(imageLoader, pauseOnScroll,  pauseOnFling);
27. listView.setOnScrollListener(listener);

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jianhuicode

如何使用融云地图,文件等插件--融云 Android SDK 2.8.0+ Extension 开发文档

转载自融云 Android SDK 2.8.0+ Extension 开发文档 融云 SDK 2.8.0 后对 会话界面输入区域、+号扩展区域、语音消息、Emo...

350100
来自专栏KK的小酒馆

Service的跨进程开发Android开发高级进阶

Service的跨进程通信主要由两种Android提供的方法进行,一个是AIDL,通过创建一个AIDL文件来完成,另一个是利用Messenger,发送Messa...

13620
来自专栏玩转全栈

flutter接入现有的app详细介绍

接入的方式,我是参考的官方的介绍文档,我这里尝试的是android的接入方式,还算比较顺利。

76030
来自专栏分享达人秀

Activity任务栈和启动模式

通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容。 Android采用任务栈(Task)的方式来管理Act...

21060
来自专栏刘望舒

探究RemoteViews的作用和原理

RmoteViews是一个能显示在其他进程的视图。同样也提供了一些基本的操作方法来修改视图的内容。

15910
来自专栏Android机动车

Retrofit实现带进度下载

Retrofit是目前最主流的网络框架了,它对网络请求几近完美的封装,大大降低了我们开发者的研发难度,缩短了研发周期。最近项目中遇到了下载视频和图片文件的需求(...

13120
来自专栏Android相关

AAC---LiveData

LiveData是一个与Activity/Fragment生命周期相关(lifecycle-aware)的Observer类。而这种相关性(awareness ...

12220
来自专栏向治洪

Android Remote Views

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

20470
来自专栏猿湿Xoong

Android 8.0 SystemUI(四):二说顶部 StatusBar

大家好,我是ptt,本篇是 SystemUI 的第四篇,也是 StatusBar 的第二说。

1.4K40
来自专栏图像识别与深度学习

《Android》Lesson02-第1个Project,Log

200120

扫码关注云+社区

领取腾讯云代金券