Universal Image Loader 学习笔记-框架配置

来源:互联网 发布:mp4变成mp3软件 编辑:程序博客网 时间:2024/05/16 12:02

UIL框架是强大的、灵活的,很重要的一点在于各种配置。

概述

ImageLoader的配置(ImageLoaderConfiguration)是应用程序的全局性的,你只能设置一次。所以,一般在自定义的Application类的onCreate()中进行配置,当然也可以在一个Activity中配置(只要在使用之前配置并且只配置一次)。配置建造器中的所有的选项都是可选择的,大家可以只使用自己想要定制的选项。

线程

Android系统中每个应用都是一个dalvik进程,该进程当中会有多个线程,大家最熟悉的就是主线程,也就是UI线程,大家也会开辟很多的子线程用来执行一些耗时任务,保证界面的流畅。每个线程都会有一个优先级(priority),它会影响操作系统如何的规划调度该线程。优先级的取值范围是[1,10],默认优先级是5,主线程优先级是5,优先级越高越先被执行。
UIL中处理任务采用的线程池(后面再说),线程池中的线程数量和优先级都是可以配置的。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .threadPriority(Thread.NORM_PRIORITY - 2)//一般比着主线程低两级                .threadPoolSize(3)//默认三个                .build();

任务

UIL中使用两个线程池进行任务的处理。

  • 第一个是一般任务线程池,用来加载和显示图片。
  • 第二个是已缓存图片任务线程池,用来显示已经缓存在硬盘(设备存储或者SD卡)中的图片。因为图片在本地,处理比较快,所以设计一个独立的线程池。
    这两个线程池是可以通过下面的方法定制的。同时,还可以定制图片显示任务的队列处理策略,先进先出(FIFO)和后进先出(LIFO)两种。
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .taskExecutor(Executor)//第一种线程池                .taskExecutorForCachedImages(Executor)//第二种线程池                .tasksProcessingOrder(QueueProcessingType.LIFO)//后进先出                .build();

注:

  • taskExecutor和taskExecutorForCachedImages调用的话,threadPriority、threadPoolSize、taskExecutorForCachedImages这三个配置失效。
  • taskExecutor和taskExecutorForCachedImages配置同一个线程池的话,任务队列中短时任务将会等待很长时间才执行。

内存缓存

该缓存是指图片位于内存当中,读取速度快。可以自己定制一下几项。

  • 实现接口MemoryCache的类,包含图片的集合以及相关的存取操作
  • 图片解码为Bitmap缓存到内存时,最大的宽和高,默认设备屏幕的宽和高
  • 内存中图片占用的最大值,默认是应用内存的八分之一,单位:字节

  • 图片占用应用可用内存百分数的最大值,默认是应用内存的八分之一

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .memoryCacheExtraOptions(100, 100)//图片宽高100px                .memoryCacheSize(1000)//1000字节                .memoryCacheSizePercentage(20)//20%                .memoryCache(new MemoryCache() {                    @Override                    public boolean put(String key, Bitmap value) {                        return false;                    }                    @Override                    public Bitmap get(String key) {                        return null;                    }                    @Override                    public Bitmap remove(String key) {                        return null;                    }                    @Override                    public Collection<String> keys() {                        return null;                    }                    @Override                    public void clear() {                    }                })                .build();

硬盘缓存

UIL框架比较经典的是三级缓存,包括内存、硬盘和网络。这个缓存策略可以不重复下载已经下载过的图片,极大的节省了用户的流量,不重复加载已经在内存中的图片,提高了图片显示的效率。缓存到硬盘的图片同样需要大家对其进行管理。

  • diskCacheExtraOptions(int maxImageWidthForDiskCache, int maxImageHeightForDiskCache,
    BitmapProcessor processorForDiskCache):设置下载下来的图片缓存到硬盘时的缩放比或者压缩比(注:又需要的时候才使用,因为会使图片加载变慢)
  • diskCacheFileCount(int maxFileCount):设置硬盘缓存目录中的最大文件数,默认是无限制的。使用此方法,将默认使用LruDiskCache作为硬盘缓存类。可以使用diskCache(DiskCache)方法来引入自己的对接口DiskCache的实现。
  • diskCacheFileNameGenerator(FileNameGenerator fileNameGenerator):设置缓存文件名的生成器,避免用户看到图片的URL。UIL自身提供了两种文件名生成器,哈希(HashCodeFileNameGenerator)和MD5(Md5FileNameGenerator)。
  • diskCacheSize(int maxCacheSize):设置硬盘中图片占用空间的最大值,单位:字节,默认值:无限制。使用此方法,将默认使用LruDiskCache作为硬盘缓存类。可以使用diskCache(DiskCache)方法来引入自己的对接口DiskCache的实现。
  • diskCache(DiskCache diskCache):设置自己的接口DiskCache的实现。默认值可以通过StorageUtils.getCacheDirectory(Context)得到。调用此方法,上面的三个方法将失效。
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .diskCacheExtraOptions(100, 100, new BitmapProcessor() {                    @Override                    public Bitmap process(Bitmap bitmap) {                        return null;                    }                })                .diskCacheFileCount(100)                .diskCacheFileNameGenerator(new Md5FileNameGenerator())                .diskCacheSize(1000)                .diskCache(new DiskCache() {                    @Override                    public File getDirectory() {                        return null;                    }                    @Override                    public File get(String imageUri) {                        return null;                    }                    @Override                    public boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException {                        return false;                    }                    @Override                    public boolean save(String imageUri, Bitmap bitmap) throws IOException {                        return false;                    }                    @Override                    public boolean remove(String imageUri) {                        return false;                    }                    @Override                    public void close() {                    }                    @Override                    public void clear() {                    }                })                .build();

图片加载

图片资源的加载可以由自己定义其实现,只要根据图片的URI返回图片的流即可。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .imageDownloader(new ImageDownloader() {                    @Override                    public InputStream getStream(String imageUri, Object extra) throws IOException {                        return null;                    }                })                .build();

图片解码

设置一个公用模块,可以对图片的流进行一些处理,返回需要的Bitmap。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .imageDecoder(new ImageDecoder() {                    @Override                    public Bitmap decode(ImageDecodingInfo imageDecodingInfo) throws IOException {                        return null;                    }                })                .build();

图片显示

设置图片显示的时候的一些默认选项,作为每次显示图片的默认选项,也可以每次通过displayImage(String, ImageView)单独设置。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())                .build();

日志输出

打开此项设置,在程序运行时可以输出ImageLoader的工作日志。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)                .writeDebugLogs()                .build();

创建

整个配置的设计采用建造者模式,通过对ImageLoaderConfiguration.Builder的各项参数设置之后,调用Builder.build()方法即可创建出ImageLoaderConfiguration,设置给ImageLoader进行初始化。

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)        .build();ImageLoader.getInstance().init(configuration);

UIL可自己灵活配置的涵盖了使用UIL的方方面面,大家可以根据自己项目的需要进行设置。后续,我努力分篇对某项配置及其实现进行学习并做笔记,水平不高,多提宝贵意见,谢谢!!!

赞助

本文由老司机学院动脑学院特约赞助。

做一家受人尊敬的企业,做一位令人尊敬的老师

1 0
原创粉丝点击