相信大家平时做Android应用的时候,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于新手来说,这些问题解决起来会比较吃力,所以就有很多的开源图片加载框架应运而生,比较著名的就是Universal-Image-Loader、Picasso、fresco等网络加载框架。这里简单介绍一下Universal-Image-Loader的用法
首先在要使用ImageLoader就要到github网站上搜索Universal-Image-Loader,然后下载
universal-image-loader-1.9.5.jar 包:
然后把jar包导入你的项目中
新建一个MyApplication继承Application,并在onCreate()中创建ImageLoader的配置参数,并初始化到ImageLoader中代码如下
package com.example.imageloaderdddd.appMy;
import java.io.File;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Handler;
import com.example.imageloaderdddd.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
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.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
public class MyApplication extends Application {
public static ImageLoader imageLoader;
//定义了几个显示的效果
public static DisplayImageOptions options1;
public static DisplayImageOptions options2;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
imageLoader = ImageLoader.getInstance();
//给ImageLoader设置配置参数
imageLoader.init(initConfig(this));
//给imageloader设置显示参数:定义怎么显示
initOption();//控制不同的显示效果
}
//得到ImageLoader的实例
public static ImageLoader getImageLoader(Context context){
if (imageLoader==null) {
imageLoader = ImageLoader.getInstance();
//给ImageLoader设置配置参数
imageLoader.init(initConfig(context));
//给imageloader设置显示参数:定义怎么显示
initOption();//控制不同的显示效果
}
return imageLoader;
}
//初始化配置参数
private static ImageLoaderConfiguration initConfig(Context context) {
//这里的路径可以自定义
File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
// 默认等于你的屏幕尺寸,设备屏幕宽高
.memoryCacheExtraOptions(480, 800)
// 在将下载的图片保存到你的sd卡之前会重新计算,压缩。
// 这个属性不要滥用,只有你在对应的需求时再用,因为他会使你的ImageLoader变的很慢。
.diskCacheExtraOptions(480, 800, null)
//用于执行从源获取图片任务的 Executor,为configuration中的 taskExecutor,
// 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
.taskExecutor(null)
//用于执行从缓存获取图片任务的 Executor,为configuration中的 taskExecutorForCachedImages,
// 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
.taskExecutorForCachedImages(null)
// 表示核心池大小(最大并发数) 默认为3
.threadPoolSize(3)
// 线程优先级,默认Thread.NORM_PRIORITY - 2
.threadPriority(Thread.NORM_PRIORITY - 2)
// 任务进程的顺序,默认为:FIFO 先进先出
.tasksProcessingOrder(QueueProcessingType.FIFO)
//设置内存缓存不允许缓存一张图片的多个尺寸,默认允许。
.denyCacheImageMultipleSizesInMemory()
//图片内存缓存
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
//memoryCacheSize 为 0,则设置该内存缓存的最大字节数为 App 最大可用内存的 1/8。
.memoryCacheSize(2 * 1024 * 1024)
// 创建最大的内存缓存百分比,默认为 13%
.memoryCacheSizePercentage(13)
// 硬盘缓存路径,默认为StorageUtils.getCacheDirectory(context)
.diskCache(new UnlimitedDiskCache(cacheDir))
//硬盘缓存大小
.diskCacheSize(50 * 1024 * 1024)
//缓存文件数量
.diskCacheFileCount(100)
// 硬盘缓存文件名生成器,默认为哈希文件名生成器
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
// 创建图片下载器,默认是BaseImageDownloader
.imageDownloader(new BaseImageDownloader(context))
// 图片解码器,负责将图片输入流InputStream转换为Bitmap对象
.imageDecoder(new BaseImageDecoder(true))
// 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
//是否显示调试log信息
.writeDebugLogs()
.build();
return config;
}
private static void initOption() {
Options options = new BitmapFactory.Options();
options1 = new DisplayImageOptions.Builder()
// 正在加载时显示的占位图
.showImageOnLoading(R.drawable.ic_launcher)
// URL为空时显示的占位图
.showImageForEmptyUri(R.drawable.ic_launcher)
// 加载失败时显示的占位图
.showImageOnFail(R.drawable.ic_launcher)
// 在加载前是否重置 view,默认为false
.resetViewBeforeLoading(false)
//设置在开始加载前的延迟时间,单位为毫秒,通过 Builder 构建的对象默认为 0
.delayBeforeLoading(1000)
// 是否缓存在内存中,通过 Builder 构建的对象默认为 false
.cacheInMemory(false)
// 是否缓存在磁盘中,通过 Builder 构建的对象默认为 false。
.cacheOnDisk(false)
//缓存在内存之前的处理程序,默认为 null
.preProcessor(null)
//缓存在内存之后的处理程序,默认为 null。
.postProcessor(null)
//下载器需要的辅助信息。下载时传入ImageDownloader.getStream(String, Object)的对象,方便用户自己扩展,默认为 null。
.extraForDownloader(null)
// 是否考虑图片的 EXIF 信息,通过 Builder 构建的对象默认为 false。
.considerExifParams(false)
// 图片的缩放类型,通过 Builder 构建的对象默认为IN_SAMPLE_POWER_OF_2
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
// bitmap的质量,默认为ARGB_8888
.bitmapConfig(Bitmap.Config.ARGB_8888)
//为 BitmapFactory.Options,用于BitmapFactory.decodeStream(imageStream, null, decodingOptions)得到图片尺寸等信息。
.decodingOptions(options)
// 在ImageAware中显示 bitmap 对象的接口。可在实现中对 bitmap 做一些额外处理,比如加圆角、动画效果。
.displayer(new SimpleBitmapDisplayer())
// handler 对象,默认为 null
.handler(new Handler())
.build();
options2 = new DisplayImageOptions.Builder()
// 正在加载时显示的占位图
.showImageOnLoading(R.drawable.ic_launcher)
// URL为空时显示的占位图
.showImageForEmptyUri(R.drawable.ic_launcher)
// 加载失败时显示的占位图
.showImageOnFail(R.drawable.ic_launcher)
// 在加载前是否重置 view,默认为false
.resetViewBeforeLoading(false)
//设置在开始加载前的延迟时间,单位为毫秒,通过 Builder 构建的对象默认为 0
.delayBeforeLoading(1000)
// 是否缓存在内存中,通过 Builder 构建的对象默认为 false
.cacheInMemory(true)
// 是否缓存在磁盘中,通过 Builder 构建的对象默认为 false。
.cacheOnDisk(true)
//缓存在内存之前的处理程序,默认为 null
.preProcessor(null)
//缓存在内存之后的处理程序,默认为 null。
.postProcessor(null)
//下载器需要的辅助信息。下载时传入ImageDownloader.getStream(String, Object)的对象,方便用户自己扩展,默认为 null。
.extraForDownloader(null)
// 是否考虑图片的 EXIF 信息,通过 Builder 构建的对象默认为 false。
.considerExifParams(false)
// 图片的缩放类型,通过 Builder 构建的对象默认为IN_SAMPLE_POWER_OF_2
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
// bitmap的质量,默认为ARGB_8888
.bitmapConfig(Bitmap.Config.ARGB_8888)
//为 BitmapFactory.Options,用于BitmapFactory.decodeStream(imageStream, null, decodingOptions)得到图片尺寸等信息。
.decodingOptions(options)
// 在ImageAware中显示 bitmap 对象的接口。可在实现中对 bitmap 做一些额外处理,比如加圆角、动画效果。
.displayer(new RoundedBitmapDisplayer(20))
// handler 对象,默认为 null
.handler(new Handler())
.build();
}
}
在MainActivity运行的代码如下
package com.example.imageloaderdddd;
import com.example.imageloaderdddd.appMy.MyApplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication.getImageLoader(getApplicationContext()).
displayImage("http://y2.ifengimg.com/a/2015_38/2cafb01b79a4f86.jpg",
(ImageView)findViewById(R.id.iv1),
MyApplication.options1);
MyApplication.getImageLoader(getApplicationContext()).
displayImage("http://y2.ifengimg.com/a/2015_38/2cafb01b79a4f86.jpg",
(ImageView)findViewById(R.id.iv2),
MyApplication.options2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
最后记得添加联网权限