美文网首页Android/Java学习日记
【Android】基于ImageLoader的工具类写法

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

作者: MarcoHorse | 来源:发表于2016-09-27 18:06 被阅读49次

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

    ImageLoader缓存机制

    2.支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
    <pre>
    下面是一些参数的解释:
    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; 图片下载器:慢速网络加载
    </pre>
    <pre>
    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()正常显示一张图片 </pre>

    1. 支持图片的内存缓存,文件系统缓存或者SD卡缓存,支持图片下载过程的监听
      <pre>
      .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
      </pre>
      4.准确的内存控制,减少OOM的可能
      有兴趣可以看看这篇文章:http://blog.csdn.net/crl7885/article/details/43877261

      ImageLoader内存
      5.较好的控制图片的加载过程
    2. 配置ImageLoader
      1.1 在项目内新建一个MyApp类继承于Application,然后在Manifest里面声明的android:name=“MyApp”
      1.2 之后在MyApp的onCreate方法内,配置ImageLoader!ImageLoader加载图片使用了单例模式,所以可以在任何地方进行配置
      <pre>/** Returns singleton class instance */
      public static ImageLoader getInstance() {
      if (instance == null) {
      synchronized (ImageLoader.class) {
      if (instance == null) {
      instance = new ImageLoader();
      }
      }
      }
      return instance;
      }
      </pre>
      经过我们上面的描述,我们可以写出根据ImageLoader的默认配置方法配置出一下代码
      <pre>
      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, "");
       }
      

      }
      </pre>

    3. 写ImageLoader工具类加载图片
      我们知道ImageLoader可以加载多种uri图片,那么我们可以考虑写一个工具类来适配各种的uri
      首先创建两个默认的配置,之后的各种改变都可以从这里衍生出来
      <pre>
      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();}
      </pre>

    <pre>
    //加载图片
    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();
    }
    </pre>

    相关文章

      网友评论

        本文标题:【Android】基于ImageLoader的工具类写法

        本文链接:https://www.haomeiwen.com/subject/aogcyttx.html