【Android】基于ImageLoader的工具类写法

传送门:https://github.com/nostra13/Android-Universal-Image-Loader
我也不知道为啥突然想写这么一篇文章!ImageLoader可以帮助我们解决各种加载图片错乱,OOM等问题,我表示非常喜欢,而且配置也不难,在GitHub上面的参考文档也写得灰常详细!
我们先来看看ImageLoader有什么特点
1.支持同步/异步多线程加载图片,支持多种Uri图片加载

"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)

【Android】基于ImageLoader的工具类写法_第1张图片
ImageLoader缓存机制

2.支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置


下面是一些参数的解释:
final Resources resources;
final int maxImageWidthForMemoryCache; 内存缓存图片的最大宽度
final int maxImageHeightForMemoryCache; 内存缓存图片的最大高度
final int maxImageWidthForDiskCache; 磁盘缓存图片的宽度
final int maxImageHeightForDiskCache; 磁盘缓存图片的高度
final BitmapProcessor processorForDiskCache; 磁盘缓存图片处理器
final Executor taskExecutor;
final Executor taskExecutorForCachedImages; 缓存任务线程池
final boolean customExecutor;
final boolean customExecutorForCachedImages; 自定义缓存线程池
final int threadPoolSize; 池里核心线程数
final int threadPriority; 线程优先级
final QueueProcessingType tasksProcessingType; 任务队列的类型:enum{LIFO、FIFO}
final MemoryCache memoryCache; 内存缓存
final DiskCache diskCache; 磁盘缓存
final ImageDownloader downloader; 图片下载器
final ImageDecoder decoder; 图片解析器
final DisplayImageOptions defaultDisplayImageOptions; 图片显示参数
final ImageDownloader networkDeniedDownloader; 图片下载器:禁止从网络加载
final ImageDownloader slowNetworkDownloader; 图片下载器:慢速网络加载


1.imageScaleType(ImageScaleType imageScaleType) //设置图片的缩放方式
缩放类型mageScaleType:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2.displayer(BitmapDisplayer displayer) //设置图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片

  1. 支持图片的内存缓存,文件系统缓存或者SD卡缓存,支持图片下载过程的监听


    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
    .memoryCacheSize(2 * 1024 * 1024)
    .memoryCacheSizePercentage(13) // default
    .diskCache(new UnlimitedDiskCache(cacheDir)) // default
    .diskCacheSize(50 * 1024 * 1024)
    .diskCacheFileCount(100)
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default

    4.准确的内存控制,减少OOM的可能
    有兴趣可以看看这篇文章:http://blog.csdn.net/crl7885/article/details/43877261

    【Android】基于ImageLoader的工具类写法_第2张图片
    ImageLoader内存

    5.较好的控制图片的加载过程

  2. 配置ImageLoader
    1.1 在项目内新建一个MyApp类继承于Application,然后在Manifest里面声明的android:name=“MyApp”
    1.2 之后在MyApp的onCreate方法内,配置ImageLoader!ImageLoader加载图片使用了单例模式,所以可以在任何地方进行配置

    /** Returns singleton class instance */
    public static ImageLoader getInstance() {
    if (instance == null) {
    synchronized (ImageLoader.class) {
    if (instance == null) {
    instance = new ImageLoader();
    }
    }
    }
    return instance;
    }

    经过我们上面的描述,我们可以写出根据ImageLoader的默认配置方法配置出一下代码

    try {
    int w = Utils.getScreenWidth();//获取屏幕宽度
    int h = Utils.getScreenHeight();//获取屏幕高度
    fileNameGenerator = new FileNameGenerator() {
    @Override
    public String generate(String imageUri) {
    return MD5Util.MD5_32(imageUri);//缓存图片命名规范
    }
    };
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(app)
    .memoryCacheExtraOptions(w, h)
    .diskCacheExtraOptions(w, h, null)
    .threadPoolSize(8)//线程池线程数量
    .threadPriority(Thread.NORM_PRIORITY - 2) //线程优先级
    .tasksProcessingOrder(QueueProcessingType.FIFO)//任务队列的类型
    .denyCacheImageMultipleSizesInMemory()
    // .memoryCache(new LruMemoryCache(3 * 1024 * 1024))
    .memoryCacheSize(1 * 1024 * 1024)
    .memoryCacheSizePercentage(30)
    // .diskCache(new LruDiscCache(StorageUtils.getCacheDirectory(app), fileNameGenerator, 10 * 1024 * 1024))//图片缓存名称MD5,缓存大小10M
    .diskCache(new UnlimitedDiscCache(StorageUtils.getCacheDirectory(app)))
    // .diskCacheSize(10 * 1024 * 1024)
    // .diskCacheFileCount(300)
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
    .imageDownloader(new BaseImageDownloader(app))
    .imageDecoder(new BaseImageDecoder(true))
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
    .build();

         ImageLoader.getInstance().init(config);
     } catch (Exception e) {
         Timber.e(e, "");
     }
    

    }

  3. 写ImageLoader工具类加载图片
    我们知道ImageLoader可以加载多种uri图片,那么我们可以考虑写一个工具类来适配各种的uri
    首先创建两个默认的配置,之后的各种改变都可以从这里衍生出来


    private static final ImageLoader LOADER = ImageLoader.getInstance();
    public static final DisplayImageOptions SIMPLE_OPTIONS = DisplayImageOptions.createSimple();//创建public static final DisplayImageOptions DEFAULT_OPTIONS = createImageOptions();
    private static DisplayImageOptions createImageOptions() {
    return new DisplayImageOptions.Builder()
    .cloneFrom(SIMPLE_OPTIONS)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .cacheInMemory(true)
    .cacheOnDisk(true)
    .delayBeforeLoading(200)
    .build();}


//加载图片
public static void loader(String url, ImageView imageView) {
loader(url, imageView, DEFAULT_OPTIONS);
}

/*
 * 加载资源文件
 * @param uri 资源文件的Uri,通过解析后得到String字符串
 * file,content都可以转成Uri
 * @param imageView
 */
public static void loader(Uri uri, ImageView imageView) {
    loader(Uri.decode(uri.toString()), imageView);
}

public static void loader(int resId, ImageView imageView) {
    loader("drawable://" + resId, imageView);
}

/*
* 圆角图片
* 也可以写自定义的BitmapDisplayer
* @return
*/
public static DisplayImageOptions creatRoundAvatarImageOptions(int size){
return new DisplayImageOptions.Builder()
.cloneFrom(DEFAULT_OPTIONS)
.displayer(new RoundedBitmapDisplayer(size))
.build();
}

你可能感兴趣的:(【Android】基于ImageLoader的工具类写法)