相信大家平时做Android应用的时候,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于新手来说,这些问题解决起来会比较吃力,所以就有很多的开源图片加载框架应运而生,比较著名的就是Universal-Image-Loader。我见到说一下
在继承Application的类中配置
package com.hy.jj.android.application;
import java.io.File;
import com.example.androidelx.R;
import com.hy.jj.android.common.Common;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
public class ElxApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
}
@Override
public void onLowMemory() {
super.onLowMemory();
ImageLoader.getInstance().clearMemoryCache();
}
public static void initImageLoader(Context context) {
File cacheDir = new File(Common.IMAGE_FILE_PATH + "/cache");
if(!cacheDir.exists()){
cacheDir.mkdirs();
}
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
config.threadPoolSize(3); // default 线程池内加载的数量
config.threadPriority(Thread.NORM_PRIORITY - 2);//设置当前线程的优先级
config.denyCacheImageMultipleSizesInMemory();
config.diskCacheFileNameGenerator(new Md5FileNameGenerator());//将保存的时候的URI名称用MD5 加密
config.diskCacheSize(100 * 1024 * 1024); // 50 Mb sd卡(本地)缓存的最大值
config.diskCacheFileCount(500); // sd卡可以缓存的文件数量
config.memoryCacheSize(2 * 1024 * 1024);// 内存缓存的最大值
config.memoryCache(new WeakMemoryCache());//禁用内存缓存
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // Remove for release app
config.diskCacheExtraOptions(480, 320, null);
config.diskCache(new UnlimitedDiskCache(cacheDir));//自定义缓存到本地路径
ImageLoader.getInstance().init(config.build());
}
public DisplayImageOptions initDisplayImageOptions() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 设置图片在下载期间显示的图片
.showImageOnLoading(R.drawable.icon_stub)
// 设置图片Uri为空或是错误的时候显示的图片
.showImageForEmptyUri(R.drawable.icon_empty)
// 设置图片加载/解码过程中错误时候显示的图片
.showImageOnFail(R.drawable.icon_error)
// 设置下载的图片是否缓存在内存中
.cacheInMemory(false)
// 设置下载的图片是否缓存在SD卡中
.cacheOnDisk(true)
.considerExifParams(true)
// 设置图片的缩放方式
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
// 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new RoundedBitmapDisplayer(0)).build();//设置圆角
/*
* EXACTLY :图像将完全按比例缩小的目标大小
* EXACTLY_STRETCHED:图片会缩放到目标大小完全
* IN_SAMPLE_INT:图像将被二次采样的整数倍
* IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
* NONE:图片不会调整
*/
return options;
}
/**
* 下面有人问到如何加载本地图片什么的,之后把那位亲的回答补充上来,谢谢各位大大提出的不足(那时候用的时候只想到用网络图片了,所以也没考虑这么多)。
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)
* */
}
//在需要图片异步加载的类中使用
private ElxApplication application = (ElxApplication) getApplication();
private ImageLoader imageLoader = ImageLoader.getInstance();
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();//图片加载的监听
//在需要加载的地方
imageLoader.displayImage(link, img, application.initDisplayImageOptions() , animateFirstListener);
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
//做些事情
}
}
}