Universal-Image-Loader 基本使用

简介


https://github.com/nostra13/Android-Universal-Image-Loader

项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。

如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。

如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。

流程图:



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

控制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)
通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width 和 android:layout_height设定的值,或者android:maxWidth 和/或 android:maxHeight设定的值来裁剪图片。

代码


public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final ImageView image1 = (ImageView) findViewById(R.id.image1);

        final ImageView image2 = (ImageView) findViewById(R.id.image2);

        final ImageView image3 = (ImageView) findViewById(R.id.image3);

        final ImageView image4 = (ImageView) findViewById(R.id.image4);

        final ImageView image5 = (ImageView) findViewById(R.id.image5);

        final ImageView image6 = (ImageView) findViewById(R.id.image6);

        final ImageView image7 = (ImageView) findViewById(R.id.image7);

        final ImageView image8 = (ImageView) findViewById(R.id.image8);

        final ImageView image9 = (ImageView) findViewById(R.id.image9);

        final ImageView image10 = (ImageView) findViewById(R.id.image10);

        String imageUrl1 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_1.jpg";

        String imageUrl2 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_2.jpg";

        String imageUrl3 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_3.jpg";

        String imageUrl4 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_4.jpg";

        String imageUrl5 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_5.jpg";

        //默认******************************************************************************************

        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) {

                image1.setImageBitmap(loadedImage);

            }

            @Override

            public void onLoadingCancelled(String imageUri, View view) {

            }

        });

        //指定图片的大小******************************************************************************************

        ImageSize mImageSize = new ImageSize(300, 300); //可以指定图片的大小

        ImageLoader.getInstance().loadImage(imageUrl2, mImageSize, new SimpleImageLoadingListener() {//缺省适配器SimpleImageLoadingListener

                    @Override

                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

                        image2.setImageBitmap(loadedImage);

                    }

                });

        //配置一些图片显示的选项******************************************************************************************

        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);

                image3.setImageBitmap(loadedImage);

            }

        });

        //使用displayImage()加载图片******************************************************************************************

        ImageLoader.getInstance().displayImage(imageUrl4, image4, options);//会根据控件的大小和imageScaleType来自动裁剪图片

        //显示图片下载进度******************************************************************************************

        ImageLoader.getInstance().displayImage(imageUrl5, image5, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {

            @Override

            public void onProgressUpdate(String imageUri, View view, int current, int total) {//得到图片的加载进度

                //    Log.i("bqt", imageUri + "----" + current + "----" + total);

            }

        });

        //加载其他来源的图片,可以是http https file assets drawable content************************************************************

        //sd卡,其中指定的文件可以是视频文件,此工具会自动加载视频的缩略图

        ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(Environment.getExternalStorageDirectory().getPath() + "/a.png"), image6, options);

        ImageLoader.getInstance().displayImage("file:///mnt/sdcard/a.mp4", image7, options);

        //assets

        ImageLoader.getInstance().displayImage("assets://a.png", image8, options);//或使用【Scheme.ASSETS.wrap("a.png")】

        //drawable

        ImageLoader.getInstance().displayImage("drawable://" + R.drawable.a, image9, options);

        //Content provider,可以是视频文件

        ImageLoader.getInstance().displayImage("content://media/external/audio/albumart/a", image10, 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/image6"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image7"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image8"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image9"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image10"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image1"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image2"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image3"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image4"

            style="@style/ImageStyle" />

        <ImageView

            android:id="@+id/image5"

            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">#55660077</item>         <item name="android:layout_margin">5dp</item>     </style>

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());

    }

}

来自为知笔记(Wiz)

时间: 2024-10-13 04:33:53

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

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

在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使用UIL遇到了这个问题,相信这个问题许多使用UIL的人都碰到过 现在把解决方法贴出来给有同样问题的朋友做参考 先看下UIL的工作流程 在已经允许内存,存储卡缓存的前提下,当一个图片被请求display时,首先要判断图片是否缓存在内存中,如果false则尝试从存储卡读取,如果依然不存在最后才从网络地址

Android Universal Image Loader 使用

1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL. 简单的说 UIL 就做了一件事--获取图片并显示在相应的控件上. 1.2 基本使用 1.2.1 初始化 添加完依赖后在Application或Activity中初始化ImageLoader,如下: public class YourApplication extends Application

Android图片异步加载框架Universal Image Loader的源码分析

项目地址:https://github.com/nostra13/android-universal-image-loader 1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL. 简单的说 UIL 就做了一件事--获取图片并显示在相应的控件上. 1.2 基本使用 1.2.1 初始化 添加完依赖后在Application或Activity中初始化I

Android 使用Universal Image Loader绘制带圆角的图片(一)

Android 使用Universal Image Loader绘制带圆角的图片(一) 绘制带圆角的控件难吗?貌似不难.对于一个普通layout或者widget,要绘制圆角,只要把 background设置成下面这样的drawable就行了. <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/and

Android Universal Image Loader 架构剖析

简介 Android Universal Image Loader简称UIL, 其github链接https://github.com/nostra13/Android-Universal-Image-Loader, 它用于Android应用中的图片加载(从网络,本地文件,或资源文件),本地缓存(内存和磁盘), 以及展示在ImageView中. 示例 整体框架 各模块的流程图 Task流程: 下载流程: decode流程: cache流程: 主要类图:

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

UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument for image loading, caching and displaying. It provides a lot of configuration options and good control over the image loading and caching process.(不知道

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

 When developing applications for Android, one often facesthe problem of displaying some graphical content from the Internet. So, youshould provide image loading from the Web in an Android app, their processingand displaying with limited memory aga

【译】UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)

在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个重载方法 void displayImage(String url, ImageView view) void displayImage(String url, ImageView view, DisplayImageOptions options) void displayImage(String

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

ImageLoader类中包含了所有操作.他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法.在使用ImageLoader来显示图片之前,你需要初始化它的配置-ImageLoaderConfiguration使用init(…)方法.然后,你就可以使用可以明确地根据需要使用不同形式的displayImage(…). 总之,ImageLoader最简单的用法如下所示(使用默认配置): ImageView imageView = ... // view, where th

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

1.全局入口的Application定义初始化: ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(getApplicationContext()) .threadPoolSize(3) //线程池内加载的数量 .threadPriority(Thread.NORM_PRIORITY - 1) // default .denyCacheImageMultipleSizesInMemory()