简介

项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。
如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。
如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。流程图:

控制OOM
虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?
  • 减少线程池中线程的个数,在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)
我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width 和 android:layout_height设定的值,或者android:maxWidth 和/或 android:maxHeight设定的值来裁剪图片。

权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Application

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中
        ImageLoaderConfiguration.Builder configuration = new ImageLoaderConfiguration.Builder(this);
        configuration.diskCacheSize(100 * 1024 * 1024); // 100 MiB
        ImageLoader.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 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // 打印log信息,Remove for release APP
        ImageLoader.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*225
    private static final String imageUrl2 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_1.jpg";//1280*720
    private static final String imageUrl3 = "http://img.bimg.126.net/photo/rl0IM2SIJK8jWXgIgxhJsw==/2871889187379358521.jpg";//3216*2028
    private 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*8000
    private static final String imageUrl7 = "file:///mnt/sdcard/video.mp4";//可以是视频文件,此工具会自动加载视频的缩略图
    private static final String imageUrl8 = "assets://big.jpg";//超大图,3600*5400
    private 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];
    @Override
    protected 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*225
        ImageLoader.getInstance().loadImage(imageUrl1, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {
            }
            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            }
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                imageViews[0].setImageBitmap(loadedImage);
                Log.i("bqt", loadedImage.getWidth() + "-1-" + loadedImage.getHeight());//330*225。和原图大小一致
            }
            @Override
            public void onLoadingCancelled(String imageUri, View view) {
            }
        });
        //2、指定图片的大小。注意,这里的大小并不一定有用,因为图片的宽高只会同时被缩放为2的n次幂的倍数。这是一个在很多地方都通用的规则。
        ImageLoader.getInstance().loadImage(imageUrl2, new ImageSize(100, 100), new SimpleImageLoadingListener() {//使用缺省适配器
                    @Override
                    public 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() {
            @Override
            public 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/2
                imageViews[2].setImageBitmap(loadedImage);
            }
        });
        //**********************************************************建议用displayImage加载图片************************************************************
        ImageLoader.getInstance().displayImage(imageUrl4, imageViews[3], options);
        ImageLoader.getInstance().displayImage(imageUrl5, imageViews[4], options, null, new ImageLoadingProgressListener() {//设置图片加载进度监听
                    @Override
                    public void onProgressUpdate(String imageUri, View view, int current, int total) {
                        Log.i("bqt", current + "----" + total);
                    }
                });
        ImageLoader.getInstance().displayImage(imageUrl6, imageViews[5], options, new SimpleImageLoadingListener() {
            @Override
            public 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" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:orientation="vertical" >
        <ImageView
            android:id="@+id/iv1"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv2"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv3"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv4"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv5"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv6"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv7"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv8"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/iv9"
            style="@style/ImageStyle" />
        <ImageView
            android: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

滑动时暂停加载监听 PauseOnScrollListener

6、ImageSize 设置宽高及旋转

7、加载圆形或圆角图片


Universal-Image-Loader 基本使用的更多相关文章

  1. universal image loader自己使用的一些感受

    1.全局入口的Application定义初始化: ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Build ...

  2. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解

    在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...

  3. Android中Universal Image Loader开源框架的简单使用

    UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...

  4. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

  5. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  6. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  7. 开源项目Universal Image Loader for Android 说明文档 (1) 简介

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  8. 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  9. 【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解

    ImageLoader类中包含了所有操作.他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法.在使用ImageLoader来显示图片之前,你需要初始化它的配置-Image ...

  10. 翻译:Universal Image Loader

    本文转载于:http://blog.csdn.net/tianxiangshan/article/details/9399183 All manipulations are held by the I ...

随机推荐

  1. 理解线程的挂起,sleep还有阻塞

    线程是靠cpu来运行的,cpu要运行一个线程(不说别的)最起码就是要占用cpu时间,象Windows这样的多任务操作系统,可以允许多个线程同时运行,所谓的同时运行并不是真正的同时运行,而是轮流运行不同 ...

  2. 94 Binary Tree Inorder Traversal(二叉树中序遍历Medium)

    题目意思:二叉树中序遍历,结果存在vector<int>中 解题思路:迭代 迭代实现: /** * Definition for a binary tree node. * struct ...

  3. 日志收集框架 Exceptionless

    日志收集框架 Exceptionless 前言 从去年就答应过Eric(Exceptionless的作者之一),在中国会帮助给 Exceptionless 做推广,但是由于各种原因一直没有做这件事情, ...

  4. Android4.2增加新键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...

  5. Solr4.8.0源码分析(9)之Lucene的索引文件(2)

    Solr4.8.0源码分析(9)之Lucene的索引文件(2) 一. Segments_N文件 一个索引对应一个目录,索引文件都存放在目录里面.Solr的索引文件存放在Solr/Home下的core/ ...

  6. 如何在github上创建一个Repository (Windows)

    一种方式是利用Github for windows工具 来操作github,这个是我推荐的方式 1 请先下载一个工具Github for windows,下载地址为:https://windows.g ...

  7. Android调用 Webservice报org.ksoap2.serialization.SoapPrimitive(转)

    android Webservice开发的时候一般情况下大家接受webservice服务器返回值的时候都是使用SoapObject soapObject = (SoapObject) envelope ...

  8. windows下bat批处理实现守护进程(有日志)

    开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windo ...

  9. VS2010中水晶报表应用及实例

    原文:VS2010中水晶报表应用及实例 基本分类如下:第一部分:VS2010简介VS2010是微软的提供的一套完整的开发环境,功能也是相当的大微软宣布了下一代开发工具和平台的正式名称,分别称为“Vis ...

  10. win7配置iis 出现:HTTP 错误 403.14 - Forbidden

    打开 IIS 管理器. 在“功能”视图中,双击“目录浏览”. 在“目录浏览”页上,在“操作”窗格中单击“启用”. 确认站点或应用程序配置文件中的 configuration/system.webSer ...