在Android开发中有各种各样的开源框架,像xUtils中的BitmapUtils,Volley中的ImageRequest请求队列,等都可以用来进行异步下载图片,然而,在这篇博客中却并不涉及他们,说的是另外一个专门针对图片加载的异步请求框架,universal-image-loader。
image-loader在使用之前,要在Application中进行初始化,得到他的对象,并进行各项设置,image-loader内部是使用单例模式来获得对象
一:Application中初始化各项设置,内存缓存,磁盘缓存设置
package com.longyue.image_loader;
import java.io.File;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import android.app.Application;
import android.os.Environment;
public class MyApp extends Application {
//磁盘缓存路径
private String cachepath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "缓存练习";
@Override
public void onCreate() {
super.onCreate();
//得到ImageLoader实例
ImageLoader loader = ImageLoader.getInstance();
//对ImageLoader进行各项设置
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(getApplicationContext());
//设置磁盘中可存储的文件数量
builder.diskCacheFileCount(100);
//设置磁盘缓存的大小
builder.diskCacheSize(8*1024*1024*10);
//定义磁盘缓存路径
builder.diskCache(new UnlimitedDiscCache(new File(cachepath)));
//设置内存缓存的大小memoryCacheSize
int memoryCacheSize = (int) (Runtime.getRuntime().maxMemory()/4);
builder.memoryCacheSize(memoryCacheSize);
//把应用内存的?%给缓存
//builder.memoryCacheSizePercentage(30);
//指定线程池的大小
builder.threadPoolSize(6);
//设置线程的优先级
builder.threadPriority(Thread.NORM_PRIORITY);
//进行填充设置
loader.init(builder.build());
}
}
二:在主界面中进行下载,调用等操作
package com.longyue.image_loader;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.app.Activity;
import android.graphics.Bitmap;
public class MainActivity extends Activity {
private ImageView iv;
private String uri = "http://img.firefoxchina.cn/2015/07/5/201507290909430.jpg";
private ImageLoader loader;
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
loader = ImageLoader.getInstance();
//清空磁盘缓存
//loader.clearDiskCache();
//清空内存缓存
//loader.clearMemoryCache();
//暂停图片下载任务
//loader.pause();
//恢复下载任务
//loader.resume();
//停止下载任务
//loader.stop();
//销毁ImageLoader实例
//loader.destroy();
//1:不传builder参数
//loader.displayImage(uri, iv);
//2:传buider参数 推荐
DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder();
//是否开启内存缓存.默认是开启的
builder.cacheInMemory(true);
//是否开启磁盘缓存
builder.cacheOnDisk(true);
//图片下载失败的时候默认显示的图片
builder.showImageOnFail(R.drawable.ic_launcher);
//图片下载过程中默认显示的图片
builder.showImageOnLoading(R.drawable.ic_launcher);
//loader.displayImage(uri, iv, builder.build());
//3在回调方法内部完成控件的加载
//图片的尺寸,还可以传递第三个参数,图片的角度
ImageSize size = new ImageSize(500, 500);
loader.loadImage(uri,size,new ImageLoadingListener() {
//开始下载调用方法
@Override
public void onLoadingStarted(String imageUri, View view) {
}
//下载失败调用此方法
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
Log.e("load_image_error",failReason.toString());
iv.setImageResource(R.drawable.ic_launcher);
}
//下载完成调用此方法
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
iv.setImageBitmap(loadedImage);
}
//取消下载调用此方法
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
}
Image_loader方法封装
//对ImageLoader进行各项设置,,在application中调用
public static void setCustomImageLaoder(Context context){
//得到ImageLoader实例
ImageLoader loader = ImageLoader.getInstance();
//对ImageLoader进行各项设置
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(context);
//设置磁盘中可存储的文件数量
builder.diskCacheFileCount(200);
//设置磁盘缓存的大小
builder.diskCacheSize(8*1024*1024*100);
//定义磁盘缓存路径
builder.diskCache(new UnlimitedDiscCache(new File(Constants.cachepath)));
//设置内存缓存的大小memoryCacheSize
int memoryCacheSize = (int) (Runtime.getRuntime().maxMemory()/4);
builder.memoryCacheSize(memoryCacheSize);
//把应用内存的?%给缓存
//builder.memoryCacheSizePercentage(30);
//指定线程池的大小
builder.threadPoolSize(6);
//设置线程的优先级
builder.threadPriority(Thread.NORM_PRIORITY);
//进行填充设置
loader.init(builder.build());
}
//利用ImageLoader进行图片的下载,,调用
public static void DownLoadImage(String url,ImageView iv){
ImageLoader loader = ImageLoader.getInstance();
DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder();
//是否开启内存缓存.默认是开启的
builder.cacheInMemory(true);
//是否开启磁盘缓存
builder.cacheOnDisk(true);
//图片下载失败的时候默认显示的图片
builder.showImageOnFail(R.drawable.loading_not);
//图片下载过程中默认显示的图片
builder.showImageOnLoading(R.drawable.loading_not);
//没有图片资源时显示图片
builder.showImageForEmptyUri(R.drawable.loading_not);
loader.displayImage(url, iv, builder.build());
}
//ImageLoader清除缓存
public void RemoveImageCache(){
ImageLoader loader = ImageLoader.getInstance();
//清空磁盘缓存
loader.clearDiskCache();
//清空内存缓存
loader.clearMemoryCache();
//销毁ImageLoader实例
//loader.destroy();
}