ImageLoader是一个广泛使用的图片库,在向网络请求图片时。使用imageView和smartView常会产生outofmemory错误,这时ImageLoader能够起到非常大的作用。主要有例如以下功能

一、功能特性:

  1. 多线程异步载入和显示图片(图片来源于网络、sd卡、assets目录,drawable目录(不能载入9patch),新增载入视频缩略图)
"http://site.com/image.png" // from Web
"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)
  1. 支持通过“listener”监视载入的过程。能够暂停载入图片,在常常使用的ListView、GridView中,能够设置滑动时暂停载入,停止滑动时载入图片(便于节约流量,在一些优化中能够使用)

  2. 缓存图片至内存时,能够更加高效的工作

  3. 高度可定制化(能够依据自己的需求进行各种配置,如:线程池。图片下载器,内存缓存策略等)

  4. 支持图片的内存缓存,SD卡(文件)缓存

  5. 在网络速度较慢时,还能够对图片进行载入并设置下载监听

二 配置具体解释

  1. 载jar包放在libs目录中
  2. AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

3.在应用中配置ImageLoaderConfiguration參数(仅仅能配置一次,如多次配置,则默认第一次的配置參数)

有两种配置方法

a、使用默认设置

public class CustomApplication extends Application{

    @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomApplication.this));
} }

b、使用自己定义配置

public class ImageLoaderApplication extends Application {
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
} public static void initImageLoader(Context context) {
//缓存文件的目录
File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每一个缓存文件的最大长宽
.threadPoolSize(3) //线程池内载入的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你能够通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.tasksProcessingOrder(QueueProcessingType.LIFO)
// 由原先的discCache -> diskCache
.diskCache(new UnlimitedDiscCache(cacheDir))//自己定义缓存路径
.imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
.writeDebugLogs() // Remove for release app
.build();
//全局初始化此配置
ImageLoader.getInstance().init(config);
}
}

注意须要在manifest文件里声明Application

 android:name="com.zj.more.CustomApplication"

4、图片显示操作

显示图片

1、  ImageLoader.getInstance().displayImage(uri, imageView);
2、 ImageLoader.getInstance().displayImage(uri, imageView, options);
3、 ImageLoader.getInstance().displayImage(uri, imageView, listener);
4、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener);
5、 ImageLoader.getInstance().displayImage(uri, imageView, options, listener, progressListener);

參数解析:

imageUrl 图片的URL地址

imageView 显示图片的ImageView控件

options DisplayImageOptions配置信息

listener 图片下载情况的监听

progressListener 图片下载进度的监听

1)方法1:最简单的方式。我们仅仅须要定义要显示的图片的URL和要显示图片的ImageView。

这样的情况下。图片的显示选项会使用默认的配置

2)方法2:载入自己定义配置的一个图片

3)方法3:载入带监听的一个图片

4)方法4:载入自己定义配置且带监听的一个图片

5) 方法5:载入自己定义配置且带监听和进度条的一个图片

ImageLoader.getInstance().displayImage(uri, imageView, options,
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {
//開始载入
}
@Override
public void onLoadingFailed(String arg0, View arg1,
FailReason arg2) {
//载入失败
}
@Override
public void onLoadingComplete(String arg0, View arg1,
Bitmap arg2) {
//载入成功
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {
//载入取消
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view,
int current, int total) {
//载入进度
}
});

实例

a、在BaseActivity中得到单例的imageLoader

public abstract class BaseActivity extends Activity {

    protected ImageLoader imageLoader;

    /**
* 初始化布局资源文件
*/
public abstract int initResource(); /**
* 初始化组件
*/
public abstract void initComponent(); /**
* 初始化数据
*/
public abstract void initData(); /**
* 增加监听
*/
public abstract void addListener(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initResource());
imageLoader = ImageLoader.getInstance();
initComponent();
initData();
addListener();
} }

b、listView实现载入图片

public class ImageListActivity extends BaseActivity {

    private ListView mListImageLv;
private DisplayImageOptions options; // 设置图片显示相关參数
private String[] imageUrls; // 图片路径 @Override
public int initResource() {
return R.layout.activity_list;
} @Override
public void initComponent() {
mListImageLv = (ListView) findViewById(R.id.lv_image);
} @Override
public void initData() {
Bundle bundle = getIntent().getExtras();
imageUrls = bundle.getStringArray(Constants.IMAGES); // 使用DisplayImageOptions.Builder()创建DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_error) // 设置图片载入或解码过程中错误发生显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.build(); // 构建完毕 mListImageLv.setAdapter(new ItemListAdapter());
} @Override
public void addListener() { } class ItemListAdapter extends BaseAdapter { @Override
public int getCount() {
return imageUrls.length;
} @Override
public Object getItem(int position) {
return imageUrls[position];
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_list,
null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) convertView
.findViewById(R.id.iv_image);
viewHolder.text = (TextView) convertView
.findViewById(R.id.tv_introduce);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} /**
* imageUrl 图片的Url地址 imageView 承载图片的ImageView控件 options
* DisplayImageOptions配置文件
*/
imageLoader.displayImage(imageUrls[position],
viewHolder.image, options);
viewHolder.text.setText("Item " + (position + 1)); // TextView设置文本 return convertView;
} public class ViewHolder {
public ImageView image;
public TextView text;
} } }

当中imageUrls 由下面MainActivity中的内容发送而来

// 点击进入ListView展示界面
public void onImageListClick(View view) {
Intent intent = new Intent(this, ImageListActivity.class);
intent.putExtra(Constants.IMAGES, Constants.images);
startActivity(intent);
}

执行效果

c、GrideView实现载入图片

临时空缺

三、提示和技巧

1、仅仅有在你须要让Image的尺寸比当前设备的尺寸大的时候,你才须要配置maxImageWidthForMemoryCach(…)和

maxImageHeightForMemoryCache(…)这两个參数,比方放大图片的时候。其它情况下,不须要做这些配置,由于默认的配置会依据屏幕尺寸以最节约内存的方式处理Bitmap。

2、在设置中配置线程池的大小是非常明智的。一个大的线程池会同意多条线程同一时候工作。可是也会显著的影响到UI线程的速度。可是能够通过设置一个较低的优先级来解决:当ImageLoader在使用的时候,能够降低它的优先级,这样UI线程会更加流畅。在使用List的时候,UI 线程常常会不太流畅,所以在你的程序中最好设置threadPoolSize(…)和threadPriority(…)这两个參数来优化你的应用。

3、memoryCache(…)和memoryCacheSize(…)这两个參数会互相覆盖,所以在ImageLoaderConfiguration中使用一个就好了

4、diskCacheSize(…)、diskCache(…)和diskCacheFileCount(…)这三个參数会互相覆盖,仅仅使用一个

注:不要使用discCacheSize(…)、discCache(…)和discCacheFileCount(…)这三个參数已经弃用

5、假设你的程序中使用displayImage()方法时传入的參数常常是一样的,那么一个合理的解决方法是。把这些选项

配置在ImageLoader的设置中作为默认的选项(通过调用defaultDisplayImageOptions(…)方法)。之后调用

displayImage(…)方法的时候就不必再指定这些选项了,假设这些选项没有明白的指定给

defaultDisplayImageOptions(…)方法。那调用的时候将会调用UIL的默认设置。

四、注意事项

1、假设你常常出现oom,你能够尝试:

1)禁用在内存中缓存cacheInMemory(false),假设oom仍然发生那么似乎你的应用程序有内存泄漏,使用MemoryAnalyzer来检測它。否则尝试下面步骤(尝试全部或几个)

2)降低配置的线程池的大小(.threadPoolSize(…)),建议1~5

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

4)配置中使用.diskCacheExtraOptions(480, 320, null)

5)配置中使用 .memoryCache(newWeakMemoryCache()) 或者全然禁用在内存中缓存(don’t call .cacheInMemory()).

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

7)避免使用 RoundedBitmapDisplayer. 调用的时候它使用ARGB-8888模式创建了一个新的Bitmap对象来显示,对于内存缓存模式 (ImageLoaderConfiguration.memoryCache(…)) 你能够使用已经实现好的方法.

2、ImageLoader是依据ImageView的height。width确定图片的宽高

3、一定要对ImageLoaderConfiguration进行初始化,否则会报错

4、开启缓存后默认会缓存到外置SD卡例如以下地址(/sdcard/Android/data/[package_name]/cache).假设外置SD卡不存在。会缓存到手机. 缓存到Sd卡须要在AndroidManifest.xml文件里进行例如以下配置

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

5、内存缓存模式能够使用下面已实现的方法 (ImageLoaderConfiguration.memoryCache(…))

1)缓存仅仅使用强引用

LruMemoryCache (缓存大小超过指定值时。删除近期最少使用的bitmap) –默认情况下使用

2)缓存使用弱引用和强引用

UsingFreqLimitedMemoryCache (缓存大小超过指定值时,删除最少使的bitmap)

LRULimitedMemoryCache (缓存大小超过指定值时,删除近期最少使用的bitmap) –默认值

FIFOLimitedMemoryCache (缓存大小超过指定值时,按先进先出规则删除的bitmap)

LargestLimitedMemoryCache (缓存大小超过指定值时,删除最大的bitmap)

LimitedAgeMemoryCache (缓存对象超过定义的时间后删除)

3)缓存使用弱引用

WeakMemoryCache(没有限制缓存)

6、本地缓存模式能够使用下面已实现的方法 (ImageLoaderConfiguration.diskCache(…))

UnlimitedDiskCache 不限制缓存大小(默认)

TotalSizeLimitedDiskCache (设置总缓存大小。超过时删除最久之前的缓存)

FileCountLimitedDiskCache (设置总缓存文件数量,当到达警戒值时。删除最久之前的缓存。假设文件的大小都一样的时候,能够使用该模式)

LimitedAgeDiskCache (不限制缓存大小。可是设置缓存时间,到期后删除)

注意。使用ImageLoader之间一定要初始化,最简单的方式就是在Application中增加

ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(CustomApplication.this));

參考链接:

Android开源框架Universal-Image-Loader具体解释 - android

Android UI-开源框架ImageLoader的完美样例 - 巫_1曲待续 - 博客频道 - CSDN.NET

完毕

ImageLoader实现图片异步载入的更多相关文章

  1. (源代码分析)Android-Universal-Image-Loader (图片异步载入缓存库)的使用配置

    转载请注明出处:http://blog.csdn.net/u011733020 前言: 在Android开发中,对于图片的载入能够说是个老生常谈的问题了,图片载入是一个比較坑的地方.处理不好,会有各种 ...

  2. Android图片异步载入框架Android-Universal-Image-Loader

    Android-Universal-Image-Loader是一个图片异步载入,缓存和显示的框架.这个框架已经被非常多开发人员所使用,是最经常使用的几个Android开源项目之中的一个,主流的应用,随 ...

  3. lazyload.js实现图片异步载入

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  4. 图片异步载入之 Android-Universal-Image-Loader

    今天在做项目的时候用了之前写的图片载入类.尽管也能实现缓存什么的.可是在载入大图的时候非常慢非常慢.于是上网找解决方式,准备优化一下,无意中发现了Android-Universal-Image-Loa ...

  5. ImageLoader实现图片异步加载

    ImageLoader是一个广泛使用的图片库,在向网络请求图片时,使用imageView和smartView常会产生outofmemory错误,这时ImageLoader可以起到很大的作用,主要有如下 ...

  6. 使用ImageLoader实现图片异步加载

    注:下面使用的是包:1.8.4,其他版本包的,DisplayImageOptions defaultOptions和 ImageLoaderConfiguration config2配置不一样,请看官 ...

  7. Android 使用图片异步载入框架Universal Image Loader的问题

    使用的Jar包 问题:        optionsm = new DisplayImageOptions.Builder()         .displayer(new RoundedBitmap ...

  8. 自己动手写android图片异步载入库

    尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44344085 接触android有半年了.关于图片异步载入.一直 ...

  9. Android新浪微博client(七)——ListView图片异步加载、高速缓存

    原文出自:方杰|p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-famil ...

随机推荐

  1. 用Multisim实现彩灯循环控制器

    2019/06/06 !转载请注明出处 1.设计任务目的与要求 1.1 展示器件 10路彩灯分别用10个发光二极管L0.L1…..L9模拟,发光二极管L0.L1…..L9从左到右排列. 1.2 要求显 ...

  2. 数组合并--php

    常用的合并数组方法有以下几种: 1  array_merge 2  '+' 3  array_merge_recursive 下面是一段对比的代码 $array1 = array(2,4," ...

  3. C语言学习12

    希尔排序 //希尔排序 #include <stdio.h> void main() { ], i; int shell(int a[], int n); printf("请输入 ...

  4. Java 多线程执行

    背景: 如果一个任务由多个子任务组成,子任务全部执行完成后然后由主线程对所有子任务结果进行封装,可以采用如下几种方式: 1.基于Guava ListenableFuture 进行: 2.基于Futur ...

  5. LeetCode(14)Longest Common Prefix

    题目 Write a function to find the longest common prefix string amongst an array of strings. 分析 该题目是求一个 ...

  6. 【HDU 3037】Saving Beans(卢卡斯模板)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  7. centos的那些小事儿!

    操作系统:centos7 1.[root@chaoge ~]# ifconfig-bash: ifconfig: 未找到命令 安装net-tools即可: [root@chaoge ~]# yum i ...

  8. 记第一次开发安卓应用——IT之家RSS阅读器

    这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...

  9. java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案

    Service层的接口中有一些比较常用方法,一次又一次的在新的Service层中被书写,所以懒惰的程序员又烦了,他们决定写个通用接口来解决这个问题. 有些项目中,实体类即承担接收表单数据的任务,又承担 ...

  10. 【ZJOI2017 Round1练习】D2T2 iqtest(排列组合)

    题意: 思路: 根据欧拉定理,a^(phi(n)-1)为a mod n的逆元 ..]of longint; s,ans,x,mo,k,phi,tmp:int64; i,m,n,j:longint; f ...