Universal Image Loader_图片异步加载

Universal Image Loader 是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。他本来是基于Fedor Vlasov‘s project 项目的,Universal Image Loader在此基础上做了很多修改。

下面是Universal Image Loader官方的说明文档:

开发安卓应用的过程中往往与遇到需要显示网络图片的情形。其实,在手机设备有限的内存空间和处理能力限制下,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面。比如:

管理下载图片的缓存;如果图片很大,内存的利用必须高效以避免内存泄露;在远程图片的下载过程中,最好能友好的显示一张替代图片;同一张图片在一个应用中可能需要以不同的尺寸显示;等等。

如果你是自己来解决上面的所有问题,大量的时间和经历都浪费在上面提到的适配上去了。这一问题的存在促使我们开发出了一个开源的library-Universal Image Loader 来解决安卓中的图片加载。我们的目标是解决上述的所有问题,同时提供灵活的参数设置来适应尽可能多的开发者。

目前,无论是加载网络图片还是本地图片,该library都可以用。用的最多的是是用列表、表格或者gallery的方式显示网络图片。

主要特性包括:
从网络或SD卡异步加载和显示图片
在本地或内存中缓存图片
通过“listener”监视加载的过程
缓存图片至内存时,更加高效的工作
高度可定制化

ImageLoader的可选设置项

在内存中缓存的图片最大尺寸
连接超时时间和图片加载超时时间
加载图片时使用的同时工作线程数量
下载和显示图片时的线程优先级
使用已定义本地缓存或自定义
使用已定义内存缓存或自定义

图片下载的默认选项

图片加载选项可以进行以下设置:
当真实图片加载成功以后,是否显示image-stub。(如果是,需要制定stub)
在内存中是否缓存已下载图片
在本地是否缓存已下载图片
图片解码方式(最快速的方式还是少占用内存的方式)

如上所述,你可以实现你自己的本地缓存和内存缓存方法,但是通常Jar包中已实现的方法已经可以满足你的需求。

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

流程图:

用法:

1.

  • Download JAR
  • libs中的 放入你的 Android project中。

2. Manifest设置


1

2

3

4

5

6

7

8

9

<manifest>

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

    <!-- Include next permission if you want to allow UIL to cache images on SD card -->

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

    ...

    <application android:name="MyApplication">

        ...

    </application>

</manifest>

3.application类


1

2

3

4

5

6

7

8

9

10

11

public class MyApplication extends Application {

    @Override

    public void onCreate() {

        super.onCreate();

        // Create global configuration and initialize ImageLoader with this configuration

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())

            ...

            .build();

        ImageLoader.getInstance().init(config);

    }

}

4.配置及选项

  • ImageLoader Configuration  是整个应用的全局设置
  • Display Options 是针对每一次显示image的任务 (ImageLoader.displayImage(...))。

Configuration

每一个参数都是可选的,只设置你需要的。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// DON‘T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.

File cacheDir = StorageUtils.getCacheDirectory(context);

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)

        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions

        .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75)

        .taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

        .taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR)

        .threadPoolSize(3) // default

        .threadPriority(Thread.NORM_PRIORITY - 1) // default

        .tasksProcessingOrder(QueueProcessingType.FIFO) // default

        .denyCacheImageMultipleSizesInMemory()

        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))

        .memoryCacheSize(2 * 1024 * 1024)

        .discCache(new UnlimitedDiscCache(cacheDir)) // default

        .discCacheSize(50 * 1024 * 1024)

        .discCacheFileCount(100)

        .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default

        .imageDownloader(new BaseImageDownloader(context)) // default

        .imageDecoder(new BaseImageDecoder()) // default

        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default

        .enableLogging()

        .build();

Display 选项


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// DON‘T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.

DisplayImageOptions options = new DisplayImageOptions.Builder()

        .showStubImage(R.drawable.ic_stub)

        .showImageForEmptyUri(R.drawable.ic_empty)

        .showImageOnFail(R.drawable.ic_error)

        .resetViewBeforeLoading()

        .delayBeforeLoading(1000)

        .cacheInMemory()

        .cacheOnDisc()

        .preProcessor(...)

        .postProcessor(...)

        .extraForDownloader(...)

        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default

        .bitmapConfig(Bitmap.Config.ARGB_8888) // default

        .decodingOptions(...)

        .displayer(new SimpleBitmapDisplayer()) // default

        .handler(new Handler()) // default

        .build();

下载图片支持的URL格式


1

2

3

4

5

String imageUri = "http://site.com/image.png"; // from Web

String imageUri = "file:///mnt/sdcard/image.png"; // from SD card

String imageUri = "content://media/external/audio/albumart/13"; // from content provider

String imageUri = "assets://image.png"; // from assets

String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)

简写方式


1

2

// Load image, decode it to Bitmap and display Bitmap in ImageView

imageLoader.displayImage(imageUri, imageView);


1

2

3

4

5

6

7

// Load image, decode it to Bitmap and return Bitmap to callback

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {

    @Override

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

        // Do whatever you want with Bitmap

    }

});

完整写法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// Load image, decode it to Bitmap and display Bitmap in ImageView

imageLoader.displayImage(imageUri, imageView, displayOptions, 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) {

        ...

    }

    @Override

    public void onLoadingCancelled(String imageUri, View view) {

        ...

    }

});


1

2

3

4

5

6

7

8

// Load image, decode it to Bitmap and return Bitmap to callback

ImageSize targetSize = new ImageSize(120, 80); // result Bitmap will be fit to this size

imageLoader.loadImage(imageUri, targetSize, displayOptions, new SimpleImageLoadingListener() {

    @Override

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

        // Do whatever you want with Bitmap

    }

});

工具函数及类

ImageLoader |
            | - getMemoryCache()
            | - clearMemoryCache()
            | - getDiscCache()
            | - clearDiscCache()
            | - denyNetworkDownloads(boolean)
            | - handleSlowNetwork(boolean)
            | - pause()
            | - resume()
            | - stop()
            | - destroy()
            | - getLoadingUriForView(ImageView)
            | - cancelDisplayTask(ImageView)

MemoryCacheUtil |
                | - findCachedBitmapsForImageUri(...)
                | - findCacheKeysForImageUri(...)
                | - removeFromCache(...)

DiscCacheUtil |
              | - findInCache(...)
              | - removeFromCache(...)

StorageUtils |
             | - getCacheDirectory(Context)
             | - getIndividualCacheDirectory(Context)
             | - getOwnCacheDirectory(Context, String)

PauseOnScrollListener转: Library Map
时间: 2024-10-01 04:36:02

Universal Image Loader_图片异步加载的相关文章

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置. GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader ,下载最新的库文件,并且导入到项目的

【转】Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

Android-Universal-Image-Loader 原文地址:http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置.

Android图片异步加载之Android-Universal-Image-Loader

将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就顺便整理记录下来,作为这一个多月来博客的重新开火做饭吧.从今天起我会陆续恢复博客的更新,也希望大家继续支持. 今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异

Android图片异步加载之Android-Universal-Image-Loader类库的使用

Android开发中我们会经常遇到图片过多或操作不当造成Out of Memory异常,有时虽然是解决了这个问题但却会影响程序的运行效率,例如:当用户在快速滑动滚动条的过程中,我们程序在仍在艰难的加载服务器端的图片,这样给用户造成了极不好的体验.其实网络上关于图片的异步加载和缓存的讲解很多,但是其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面,针对这一广大开发者都会遇到的问题,一些牛人们已经帮我们解决了这一问题,今天我为大家介绍一款很流行的开源类库,可以很很好的解决

简单的ListView中item图片异步加载

前言: 在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现在就讲讲当图片被完全获取到后在显示的方法. 一,效果图:       初始化:                                                   获取后:                         1.1,效果思路: 初始化的时候默认ImageView显示一张白色的图

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

Android编程之图片(异步)加载类

应某人之请,写一篇关于图片加载类.其实,网上有很多这样的类,而且比较推崇的是来自google中开源中的一篇.他写的比较好了,而且注意了内存优化,下面贴出它的图片下载类: [java] view plaincopy /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not 

Android性能优化之实现双缓存的图片异步加载工具(LruCache+SoftReference) - 拿来即用

之前在郭大神的博客看到使用LruCache算法实现图片缓存的.这里仿效他的思路,自己也写了一个. 并加入ConcurrentHashMap<String, SoftReference<Bitmap>>去实现二级缓存,因为ConcurrentHashMap是多个锁的线程安全,支持高并发.很适合这种频繁访问读取内存的操作. 下面整个思路是,使用了系统提供的LruCache类做一级缓存, 大小为运行内存的1/8,当LruCache容量要满的时候,会自动将系统移除的图片放到二级缓存中,但为

Android图片异步加载之Android-Universal-Image-Loader(转)

今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决方案.做Android的同学都知道,Android加载大量图片时,由于系统分配给图片加载的内存大小有限,所以,如果加载图片量非常大的话容易报OOM异常,关于这个异常已经有不少解决方案了,我就不赘述.下面就简要介绍下这个开源项目的主要功能和使用: 一.功能概要 多线程图片加载: 灵活更改ImageLo