Universal-Image-Loader 基本使用
简介
项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。流程图:
控制OOM虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width 和 android:layout_height设定的值,或者android:maxWidth 和/或 android:maxHeight设定的值来裁剪图片。
- 减少线程池中线程的个数,在ImageLoaderConfiguration中的.threadPoolSize中配置,推荐配置1-5
- 在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
- 在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存
- 在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)
权限<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Application
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中ImageLoaderConfiguration.Builder configuration = new ImageLoaderConfiguration.Builder(this);configuration.diskCacheSize(100 * 1024 * 1024); // 100 MiBImageLoader.getInstance().init(configuration.build());// 也可以自己设置配置参数,很多设置在新版中已经被废弃了// initImageLoader(getApplicationContext());}public static void initImageLoader(Context context) {ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);config.threadPriority(Thread.NORM_PRIORITY - 2);config.denyCacheImageMultipleSizesInMemory();config.diskCacheFileNameGenerator(new Md5FileNameGenerator());config.diskCacheSize(50 * 1024 * 1024); // 50 MiBconfig.tasksProcessingOrder(QueueProcessingType.LIFO);config.writeDebugLogs(); // 打印log信息,Remove for release APPImageLoader.getInstance().init(config.build());}}
Activity
public class MainActivity extends Activity {private static final String imageUrl1 = "http://img.ivsky.com/img/bizhi/co/201601/19/linyun-001.jpg";//330*225private static final String imageUrl2 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_1.jpg";//1280*720private static final String imageUrl3 = "http://img.bimg.126.net/photo/rl0IM2SIJK8jWXgIgxhJsw==/2871889187379358521.jpg";//3216*2028private static final String imageUrl4 = "http://img.bimg.126.net/photo/rl0IM2SIJK8jWXgIgxhJsw==/2871889187379358521.jpg";private static final String imageUrl5 = "http://img.ivsky.com/img/bizhi/co/201601/19/fireworks-005.jpg";private static final String imageUrl6 = Scheme.FILE.wrap(Environment.getExternalStorageDirectory().getPath() + "/very_big.jpg");//超级大图6000*8000private static final String imageUrl7 = "file:///mnt/sdcard/video.mp4";//可以是视频文件,此工具会自动加载视频的缩略图private static final String imageUrl8 = "assets://big.jpg";//超大图,3600*5400private static final String imageUrl9 = "drawable://" + R.drawable.ic_launcher;private static final String imageUrl10 = "content://media/external/audio/albumart/a";//加载失败private static final int[] ids = { R.id.iv1, R.id.iv2, R.id.iv3, R.id.iv4, R.id.iv5, R.id.iv6, R.id.iv7, R.id.iv8, R.id.iv9, R.id.iv10 };private ImageView[] imageViews = new ImageView[ids.length];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);for (int i = 0; i < ids.length; i++) {imageViews[i] = (ImageView) findViewById(ids[i]);}//1、默认,330*225ImageLoader.getInstance().loadImage(imageUrl1, new ImageLoadingListener() {@Overridepublic void onLoadingStarted(String imageUri, View view) {}@Overridepublic void onLoadingFailed(String imageUri, View view, FailReason failReason) {}@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {imageViews[0].setImageBitmap(loadedImage);Log.i("bqt", loadedImage.getWidth() + "-1-" + loadedImage.getHeight());//330*225。和原图大小一致}@Overridepublic void onLoadingCancelled(String imageUri, View view) {}});//2、指定图片的大小。注意,这里的大小并不一定有用,因为图片的宽高只会同时被缩放为2的n次幂的倍数。这是一个在很多地方都通用的规则。ImageLoader.getInstance().loadImage(imageUrl2, new ImageSize(100, 100), new SimpleImageLoadingListener() {//使用缺省适配器@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {imageViews[1].setImageBitmap(loadedImage);Log.i("bqt", loadedImage.getWidth() + "-2-" + loadedImage.getHeight());//320*180。原图大小1280*720}});//3、配置一些图片显示的选项。测试时发现加载中以及加载失败时设置显示的图片均没有显示出来!DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true)//将图片缓存到内存和硬盘中.showImageOnLoading(R.drawable.loading).showImageOnFail(R.drawable.failed)//设置加载中以及图片加载出现错误时显示的图片.bitmapConfig(Bitmap.Config.RGB_565).build();ImageLoader.getInstance().loadImage(imageUrl3, options, new SimpleImageLoadingListener() {@Overridepublic void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {super.onLoadingComplete(imageUri, view, loadedImage);Log.i("bqt", loadedImage.getWidth() + "-3-" + loadedImage.getHeight());//1608*1014。原图3216*2028。宽高自动缩放为1/2imageViews[2].setImageBitmap(loadedImage);}});//**********************************************************建议用displayImage加载图片************************************************************ImageLoader.getInstance().displayImage(imageUrl4, imageViews[3], options);ImageLoader.getInstance().displayImage(imageUrl5, imageViews[4], options, null, new ImageLoadingProgressListener() {//设置图片加载进度监听@Overridepublic void onProgressUpdate(String imageUri, View view, int current, int total) {Log.i("bqt", current + "----" + total);}});ImageLoader.getInstance().displayImage(imageUrl6, imageViews[5], options, new SimpleImageLoadingListener() {@Overridepublic void onLoadingComplete(String paramString, View paramView, Bitmap loadedImage) {Log.i("bqt", loadedImage.getWidth() + "-6-" + loadedImage.getHeight());//750*1000。原图6000*8000。宽高自动缩放为1/8。}});ImageLoader.getInstance().displayImage(imageUrl7, imageViews[6], options);ImageLoader.getInstance().displayImage(imageUrl8, imageViews[7], options);//或使用【Scheme.ASSETS.wrap("a.png")】ImageLoader.getInstance().displayImage(imageUrl9, imageViews[8], options);ImageLoader.getInstance().displayImage(imageUrl10, imageViews[9], options);}}
布局、样式
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#fff"android:orientation="vertical" ><ImageViewandroid:id="@+id/iv1"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv2"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv3"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv4"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv5"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv6"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv7"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv8"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv9"style="@style/ImageStyle" /><ImageViewandroid:id="@+id/iv10"style="@style/ImageStyle" /></LinearLayout></ScrollView><style name="ImageStyle" ><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:layout_gravity">center</item><item name="android:background">#2000</item><item name="android:padding">1dp</item></style>
常用方法
1、ImageLoader 显示图片的方法2、ImageLoader 其他的方法3、ImageLoaderConfiguration.Builder 的方法4、DisplayImageOptions 的方法5、监听下载过程监听 ImageLoadingListener和SimpleImageLoadingListener滑动时暂停加载监听 PauseOnScrollListener6、ImageSize 设置宽高及旋转7、加载圆形或圆角图片
Universal-Image-Loader 基本使用的更多相关文章
- universal image loader自己使用的一些感受
1.全局入口的Application定义初始化: ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Build ...
- 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...
- Android中Universal Image Loader开源框架的简单使用
UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...
- android universal image loader 缓冲原理详解
1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...
- 开源项目Universal Image Loader for Android 说明文档 (1) 简介
When developing applications for Android, one often facesthe problem of displaying some graphical ...
- 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍
When developing applications for Android, one often facesthe problem of displaying some graphical ...
- 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
ImageLoader类中包含了所有操作.他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法.在使用ImageLoader来显示图片之前,你需要初始化它的配置-Image ...
- 翻译:Universal Image Loader
本文转载于:http://blog.csdn.net/tianxiangshan/article/details/9399183 All manipulations are held by the I ...
随机推荐
- 解决 Ubuntu15.04 登陆界面无限循环 的问题
本人新手,在学习linux 安装NVIDIA 驱动的时候出现了一个奇怪的问题:登陆界面输入正确的账户密码,短暂闪烁后又返回了登陆界面.经查阅多种资料,已解决此问题 以下内容来自:http://blog ...
- underscorejs-min学习
2.16 min 2.16.1 语法: _.min(list, [iteratee], [context]) 2.16.2 说明: 返回list中的最小值. list为集合,数组.对象.字符串或arg ...
- Yii框架AR对象数据转化为数组
demo函数作用:将AR对象数据转化为数组 局限:仅用于findAll的多维数组,find一维数组可以先转化为多维数组的一个元素在使用 function actionIndex() { $data = ...
- 查看Linux某个进程打开的文件句柄(file descriptor)数量
先找到进程的pid 然后: lsof -p [pid] | wc -l 或者 ls /proc/[pid]/fd | wc -l 查看系统总共使用中的文件描述符数量: lsof | wc -l ref ...
- COJ 0332 The Flash
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=302 The Flash 难度级别:B: 运行时间限制:1000ms: 运行 ...
- uboot mkimage使用详解
mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...
- ubuntu14.04下嵌入式工作环境搭建
昨天作死一不小心把小红帽home目录下的东西删光了.跟着国嵌的视频学了这么久,对linux也算是有些熟悉,就决定自己在ubuntu下搭建一个工作环境.整个过程还算比较顺利,不过也有些小波折.下面把这次 ...
- Visual Studio创建跨平台移动应用_03.AppBuilder Extension
1 背景 本章节是关于Telerik AppBuilder for Visual Studio的. 目前(2014.12)为Telerik公司Telerik Platform的一部分,Telerik ...
- JS调试工具
IE http://msdn.microsoft.com/zh-cn/library/ie/dn255003(v=vs.85).aspx FF http://www.wumii.com/item/1g ...
- Java:Date、Calendar、Timestamp的区别、相互转换与使用【转载】
1 Java.util.Date 包含年.月.日.时.分.秒信息 包含年.月.日信息. 继承自java.util.Date.在数据库相关操作中使用,如rs.getDate,ps.setDate等.rs ...












